- 객체 지향에 대한 설명과 객체 지향의 4대 특성에 대해 알아보는 챕터
객체지향
- 프로그래밍 언어는 개발자를 편하고 이롭게 하기 위해서 발전해왔다
- 객체지향 역시 기계 종속적으로 개발하는 것이 아니라 인간이 인지하기 더 편한 사고 체계를 끌여들어 개발을 더 수월하게 하기 위해 만들어졌다
구조적 프로그래밍 언어 vs 객체 지향
- 구조적 프로그래밍 언어는 D&C(Divide and Conquer)를 중심으로 생각했다. 즉, 문제를 작은 조각들로 나누어 하나씩 해결하는 방식으로 함수가 가장 중요했다
- 객체 지향은 우리가 주변 사물을 인지하는 방식대로 프로그래밍 하는 것이며 컴퓨터에 맞춰 사고하지 않고 현실 세계를 인지하는 방식으로 프로그램을 만든다. 그렇기 때문에 직관적이다.
객체 지향의 사물 인지 방식
- 세상에 존재하는 모든 것은 사물 즉 객체
- 각각의 사물은 고유하다
- 사물은 속성을 가진다
- 사물은 행위를 한다
- 이 사물을 하나하나 이해하는 것보다 사물을 분류(class)해서 이해하는 것이 인간의 인지법
클래스 vs 객체
- 클래스는 분류에 대한 개념이고 객체(Object, Instance)는 실체
객체 지향의 4대 특성
- 캡슐화
- 상속(재사용)
- 추상화
- 다형성
추상화
- 추상화는 모델링이다. 즉, 구체적인 것을 분해해서 필요한 특성을 중심으로 재조합 하는 것이라고 정리할 수 있다.
- 이렇게 객체를 추상화 한 클래스와 객체의 관계는 다음과 같이 표현된다
클래스 객체_참조_변수 = new 클래스();
- 추상화를 통해 모델링을 하면 클래스 멤버 속성, 클래스 멤버 메서드, 객체 멤버 속성, 객체 멤버 메서드라는 4개의 요소를 설계하게 된다
- 클래스 멤버 속성과 메서드는 static으로 메모리의 스태틱(메서드)영역에 상주하며 클래스가 JVM 구동 시 스태틱 영역에 바로 배치되기 때문에 객체의 존재 여부와 상관없이 쓸 수 있다
- 객체 멤버는 인스턴스 멤버라고도 하며 힙 영역에 객체가 생성된 이후에 사용할 수 있다
상속 : 재사용 + 확장
- 상속은 재사용과 확장이다
- 상위 클래스로 갈수록 추상화, 일반화가 되며 하위 클래스로 갈수록 구체화, 특수화 된다
- 하위 클래스는 상위 클래스다
- 객체 지향에서의 상속은 상위 클래스의 특성을 재사용하고 확장하는 것이다. 그러므로 하위 클래스는 상위 클래스의 메서드를 사용할 수 있다
- 다중 상속은 상위 클래스의 메서드를 특정하기 어렵기 때문에 사용하지 않고 대신 인터페이스를 도입하였다
- 인터페이스는 클래스가 할 수 있는 기능을 구현하고 강제할 수 있도록 되어있다
- 하위 클래스를 구현하면 상위 클래스 역시 구현되어 메모리에 올라가게 된다
다형성 : 사용편의성
- 객체 지향에서 다형성이라 하면 오버라이딩(ride)과 오버로딩(load)이라 할 수 있다
public class Animal {
public String name;
public void showName() {
System.out.printf("안녕 나는 %s야. 반가워\n", name);
}
}
public class Penguin extends Animal {
public String habitat;
public void showHabitat() {
System.out.printf("%s는 %s에 살아\n", name, habitat);
}
public void showName() {
System.out.println("어머 내 이름은 알아서 뭐하게요?");
}
public void showName(String yourName) {
System.out.printf("%s 안녕, 나는 %s라고 해\n", yourName, name);
}
}
public class Driver {
public static void main(String[] args) {
Penguin pororo = new Penguin();
pororo.name = "뽀로로";
pororo.habitat = "남극";
pororo.showName();
pororo.showName("sehun");
pororo.showHabitat();
Animal pingu = new Penguin();
pingu.name = "핑구";
pingu.showName();
}
}
- 오버라이딩을 통한 메서드 재정의, 오버로딩을 통한 메서드 중복 정의를 통해 다형성을 제공하고 이 다형성이 사용편의성을 제공한다
캡슐화 : 정보 은닉
- 상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변수를 이용해서 접근해야 한다
- 정적 멤버는 클래스명 정적 멤버 형식으로 접근하는 것을 권장한다
- call by value : 값이 복사되며 변수가 서로 영향을 주지 않음
- call by reference : 주소가 복사되며 변수가 서로 영향을 줌