본문 바로가기

Study/Java

객체지향 프로그래밍 6장(1강 ~ 5강)

728x90

OOP(Object-Oriented Programming)

객체지향 언어 = 프로그래밍 언어 + 객체지향개념(규칙)

참고. 

 객체지향 이론의 기본 개념은 '실제 세계는 사물(객체로)' 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다. 실제 사물의 속성과 기능을 분석 후 데이터(변수)로 정의함으로써 실제 세계를 컴퓨터 속에 옮겨 놓은 것과 같은 가상 세계를 구현하고 이 가상세계에서 모의실험을 통해 많은 시간과 비용을 절약할 수 있다. 

 

객체지향 핵심 개념(캡 상추다!)

캡슐화(Encapsulation)?

 - 객체의 속성과 행위를 하나로 묶고 구현 내용을 외부에 감춘다.

 - 정보은닉(Information Hiding)

 

상속(Inheritance)?

 - 부모 클래스의 변수/메서드를 자식 클래스가 물려받아 그대로 사용 가능하게 해 줌.

 - 부모 클래스는 superclass, 자식 클래스를 subclass라 부른다.

 

추상화(Abstraction)?

 - 공통의 속성이나 기능을 묶어 이름을 붙이는 것, 객체 지향 관점에 클래스를 정의하는 것을 추상화라고 할 수 있다.

 

⭐다형성(Polymorphism)⭐?

 -  하나의 객체가 여러 가지 타입을 가질 수 있는 것

객체지향 언어의 주요 특징

1. 코드의 재사용성이 높다?
 - 기존의 코드를 이용하여 쉽게 작성 가능.
2. 코드의 관리가 용이하다?
 - 유지보수가 용이하다. 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다?
 - 중복 코드 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.

클래스 객체의 정의와 용도

클래스의 정의

 - 클래스란 객체를 정의해 놓은 것이다.

 

클래스의 용도

 - 클래스는 객체를 생성하는 데 사용된다.

 

Q. 객체란?

 - 실제로 존재하는 것. 사물 또는 개념

 

Q. 객체의 용도?

 - 객체가 가지고 있는 기능과 속에 따라 다르다.

클래스 객체
제품 설계도 제품

 

참고.

우리가 타는 자동차(객체)를 만들기 위해서는, 자동차 설계도(클래스)가 필요하다.

프로그래밍에서는 먼저 클래스(설계도)를 작성한 다음, 클래스로부터 객체(자동차)를 생성하여 사용한다.

 

Q. 객체와 인스턴스란?

- 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화(instantiate)라고 한다.

- 어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.

 

A. 객체와 인스턴스를 엄격히 구분할 필요는 없지만, 문맥에 따라 구별하여 사용하는 것이 좋다.

책상(객체)은 책상 클래스(설계도)의 인스턴스다.

참고.

객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있고

인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있다.

 

객체의 구성요소 - 속성과 기능

속성(변수) 크기, 길이, 높이,
색상, 볼륨, 채널 등
기능(메서드) 켜기, 끄기, 볼륨 높이기, 볼륨 낮추기, 채널 변경하기 등

 

참고. 용어 정리

속성(property) 멤버변수(variable), 특성(attribute), 필드(field), 상태(state)
기능(function) 메서드(method), 함수(function), 행위(behavior)

 

클래스와 객체 Q&A

Q. 클래스가 왜 필요한가?

A. 객체(제품)를 생성하기 위해 필요합니다.

 

Q. 객체가 왜 필요한가.

A. 객체를 사용하기 위해.

 

Q. 객체를 사용한다는 것은?

A. 객체가 가진 속성과 기능을 사용하려고.

 

하나의 소스파일에 여러 클래스 작성 규칙.

package com.seulgae.ch06;
//하나의 소스파일에는 하나의 클래스만 작성하는 것이 바람직
//public class Hello2 {} // 소스파일의 이름은 public class 이름과 일치, public class가 없는 경우에는 상관없음
class hello2{}
class Hello3 {
	public static void main(String[] args) { // 소스파일명과 클래스 이름이 다를 경우 컴파일러가 알아서 아무거나 실행시킴.
		System.out.println("hello");
		System.out.println("실습 타이틀 변경하기");
	}
}
/*
public class Hello3 {} // 하나의 소스파일에는 하나의 public class만 허용
//The public type Hello3 must be defined in its own file
 */
class Hello4 {}

 

올바른 작성 예 설명
public class가 있는 경우, 소스파일의 이름은 반드시 public class의 이름과 일치해야 한다.
public class가 하나도 없는 경우, 소스파일의 이름은 'Hello2.java', 'Hello3.java' 둘 다 가능하다.
잘못된 작성 예 설명
하나의 소스파일에 둘 이상의 public class가 존재하면 안된다. 각 클래스를 별도의 소스파일에 나눠서 저장하던가 아니면 둘 중의 한 클래스에 public을 붙이지 않아야 한다.
소스파일의 이름이 public class의 이름과 일치하지 않는다.
소스파일의 이름을 'Hello2.java'로 변경해야 맞다.
소스파일의 이름과 public class의 이름이 일치하지 않는다.
대소문자를 구분하므로 대소문자까지 일치해야 한다.
그래서, 소스파일의 이름에서 'h'를 'H'로 바꿔야 한다.

 

객체의 생성

클래스명 변수명;              // 클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); // 클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장

Tv t;               // Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); // Tv인스턴스 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장

Tv t = new Tv(); // 한줄로 작성 가능

1. 참조 변수(주소를 담는 변수) 선언

Tv t; 

2. 객체를 생성

new Tv();

3. 참조변수 t에 객체 주소를 담는다.

t = new Tv();

 

참고.

Tv t = new Tv(); // 한 줄로 작성 가능.

- 인스턴스는 참조 변수를 통해서만 다룰 수 있으며, 참조 변수의 타입은 인스턴스의 입과 일치해야 한다.

객체의 사용

package com.seulgae.ch06;

class Tv{
	// Tv의 속성(멤버변수)
	String color; //색상
	boolean power; //전원상태
	int channel; // 채널
	
	// Tv의 기능(메서드)
	void power() { power = !power; } // Tv를 켜거나 끄는 기능을 하는 메서드
	void channelUp() { ++channel; } // Tv의 채널을 높이는 기능을 하는 메서드
	void channelDown() { --channel; } // Tv의 채널을 낮추는 기능을 하는 메서드
}

public class TvTest {
	public static void main(String[] args) {
		Tv t;
		t = new Tv();
		t.channel = 7;
		t.channelDown();
		System.out.println("현재 채널은 " + t.channel + " 입니다.");
	}
}

 

참조 변수가 가리키는 객체 메모리 구조.

짜란~

t.channel = 7;

- t에 저장된 주소에 있는 인스턴스 멤버 변수 channel에 7을 저장한다.

- 인스턴스의 멤버 변수(속성)를 사용하려면 "참조 변수.멤버 변수"와 같이 하면 된다.

 

t.channelDown();

- t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출한다.

- 인스턴스의 메서드를 사용하려면 "참조 변수.메서드"와 같이 하면 된다.

 

package com.seulgae.ch06;

class Tv2{
	// Tv의 속성(멤버변수)
	String color; //색상
	boolean power; //전원상태
	int channel; // 채널
	
	// Tv의 기능(메서드)
	void power() { power = !power; } // Tv를 켜거나 끄는 기능을 하는 메서드
	void channelUp() { ++channel; } // Tv의 채널을 높이는 기능을 하는 메서드
	void channelDown() { --channel; } // Tv의 채널을 낮추는 기능을 하는 메서드
}

public class TvTest2 {
	public static void main(String[] args) {
		Tv t1 = new Tv();
		Tv t2 = new Tv();
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
		
		t1.channel = 7;
		System.out.println("t1의 channel값을 7로 변경하였습니다.");
		
		System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
		System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
	}
}

Tv t1 = new Tv(); 
Tv t2 = new Tv();

t1.chennel = 7;

- Tv클래스의 인스턴스 t1과 t2를 생성한 후에, 인스턴스 t1의 멤버 변수인 channel의 값을 변경한다면 결과는?

- 같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(멤버 변수)은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일하다.

 

Q. 인스턴스의 속성(멤버변수)은 서로 다른 값을 유지한다는 말이 뭔가요?

A. 집 주소가 다르다고 생각하면 됩니다. 그래서 집에  같은 Tv(chennel)가 있다고 해도 채널 변경 시 다른 주소에 있는 집 Tv의 채널이 변경되지 않는 것처럼 생각하시면 됩니다. 

 

참조변수의 규칙

하나의 인스턴스를 여러 개의 참조변수가 가리킬 수 있지만.

하나의 인스턴스

여러 인스턴스를 하나의 참조변수가 가르킬 수 없다.

여러개의 인스턴스

Q. 왜?

A. 변수는 하나의 값만 저장 가능하기 때문이다.

 

객체 배열

Tv[] tvArr = new Tv[3];  // 길이가 3인 Tv타입의 참조변수 배열

이건 객체 배열만 생성한거임. 사용하려면 객체를 생성해야됨.

객체 배열만 생성해 놓고 '분명히 객체를 생성했는데, 에러가 발생한다.'라는 똥멍청이짓 하지말자.

 

// 객체를 생성해서 각 요소에 저장

tvArr[0] = new Tv();

tvArr[1] = new Tv();

tvArr[2] = new Tv();

객체생성배열

배열의 초기화 블럭을 사용한다면 한줄로 간단히 할 수 있다.

 

Tv[] tvArr = { new Tv(), new Tv(), new Tv() };

 

 

 

반응형

'Study > Java' 카테고리의 다른 글

객체지향 프로그래밍 6장(11강 ~ 15강)  (0) 2022.06.03
객체지향 프로그래밍 6장(6강 ~ 10강)  (0) 2022.06.02
Java18_멀티스레드  (0) 2022.05.14
Java16_컬렉션프레임워크  (0) 2022.05.14
Java15_내장클래스  (0) 2022.05.14