1. 객체 지향은 인간 지향이다
•
객체 지향: 0과 1로 대변되는 기계에 맞춰 사고하던 방식을 버리고,
인간이 현실 세계의 주변 사물(object)을 인지하는 방식대로 프로그래밍 해보자.
◦
직관적.
◦
속성 따로, 메서드 따로가 아닌 객체 단위의 프로그래밍.
•
객체(사물)(object): 세상에 존재하는 모든 것. ex) 김종민, 한효주, 김연아
◦
각 객체는 고유함. ex) 김종민, 한효주, 김연아
◦
객체는 분류해서 이해됨. ex) 위 예시의 세 객체는 사람이라는 분류(class)에 속함.
◦
객체는 속성을 가짐. ex) 사람이라는 분류 안의 각 객체(김종민)는 나이, 몸무게의 속성 가짐.
◦
객체는 행위를 함. ex) 사람이라는 분류 안의 각 객체(김종민)는 먹다, 자다 등의 행위 가짐.
객체명: 김종민
class명: 사람
김종민 객체의 속성: 나이 19, 몸무게 80
김종민 객체의 행위: 먹다, 자다
Java
복사
2. 객체 지향의 4대 특성: 추상화, 상속, 다형성, 캡슐화
•
추상화(Abstraction): 모델링
•
상속: 재사용과 확장
•
다형성(Polymorphism): 사용 편의
•
캡슐화(Encapsulation): 정보 은닉
3. 클래스와 객체의 관계(분류와 사물의 관계)
•
클래스(class): 분류에 대한 개념. 실체가 아님 ex) 사람, 펭귄
◦
객체들을 특성에 따라 분류
◦
같은 속성(필드)과 기능(메서드)을 가진 여러 객체를 총칭하는 집합의 개념
◦
모델링의 결과
◦
속성의 값을 가질 수 없음. 따라서 나이나 제조 일자 없음
•
객체(object, instance): 실체 ex) 김연아, 뽀로로
◦
세상에 존재하는 유일무이한 사물
◦
속성의 값을 가짐. 따라서 나이나 제조 일자 있음
•
예시) 사람 줄리엣 = new 사람();
◦
사람이라는 클래스(분류)를 이용해 유일무이하고 새로운 하나의 사람(객체)를 만들어 줄리엣(객체 참조 변수)이라는 이름을 지어준 것임
4. 추상화(모델링)
•
추상화: 공통 특성/ 공통 속성 추출
◦
구체적인 것을 분해해서 관심 영역에 대한 특성만 가지고 재조합하는 것
◦
추상화는 곧 모델링임
◦
애플리케이션 경계: 관심 영역
→ 사람 클래스가 사람 객체들의 모든 특성을 나열할 필요 없음. 만들고자 하는 애플리케이션이 어디에서 사용될 것인가에 따라 클래스 설계가 달라짐.
•
자바에서 추상화
◦
클래스 객체참조변수 = new 클래스();
◦
새로운 객체를 하나 생성해 그 객체의 주소값을 객체 참조 변수에 할당
•
추상화 과정
1. 클래스 모델링
2. 만든 클래스를 가지고 객체 생성
•
클래스 멤버와 객체 멤버
◦
클래스 멤버 = static 멤버 = 정적 멤버
▪
[스태틱] 객체가 아닌 클래스에 속해있어 JVM 구동 스태틱 영역에 바로 배치됨
▪
정적 멤버 메서드: 객체들의 존재 여부와 관계 없이 쓸 수 있어야 할 때
▪
정적 멤버 속성: 클래스의 모든 객체가 같은 값 가질 때
◦
객체 멤버 = 인스턴스 멤버 = 오브젝트 멤버
▪
[힙] 객체 생성자 호출 시 힙 영역에 배치됨
클래스 멤버 메서드와 객체 멤버 메서드
클래스 멤버 속성(static 변수)과 객체 멤버 속성(인스턴스 변수)
•
변수 정리
◦
static 변수: 클래스 멤버 속성(변수)
▪
[스태틱] 영역
▪
자동 초기화
▪
전역 변수(공유 변수)
◦
인스턴스 변수: 객체 멤버 속성(변수)
▪
[힙] 영역
▪
자동 초기화
▪
다수의 객체 메서드가 공유(공유 변수)
◦
지역 변수
▪
초기화 안하면 쓰레기값
•
[스택] 영역
◦
멤버 속성(변수)들을 자동 초기화 해주는 이유: 공유 변수 성격 가져서 딱히 누가 초기화해야 한다고 규정할 수 없어서
5. 상속(재사용과 확장)
•
상속: 상위 클래스(동물)의 특성을 하위 클래스(강아지)에 상속하고, 거기에 더해 필요한 특성을 추가해 사용
◦
즉, 하위 클래스는 상위 클래스의 특성을 재사용하면서 더 확장(세분화)한 것임
▪
ex) 강아지(하위 클래스)는 동물(상위 클래스)이면서 멍멍 짖는다.
◦
결과적으로, 특성 개수로 따지면 하위 클래스(동물의 특성+멍멍 짖는 특성) > 상위 클래스(동물의 특성)
◦
상위 클래스(동물)일수록 추상화, 일반화 된 것.
◦
하위 클래스(강아지)일수록 구체화, 특수화 된 것.
•
”하위 클래스는 상위 클래스다.”
◦
ex) 강아지는 동물이다!
•
자바에서 상속 → extends(확장) 키워드 사용
public class 동물 { ... }
public class 강아지 extends 동물 { ... }
Java
복사
•
상속의 강력함
◦
코드 작성 전 유의할 점: 클래스명(동물, 강아지)은 분류스럽게, 객체 참조 변수명(검둥이, 흰둥이)은 유일무이한 사물스럽게!
동물.java
강아지.java
Driver01.java → 상속의 장점 1: 재사용
Driver02.java → 상속의 장점 2: 인간의 논리라 객체 지향적
•
하위 클래스 is a kind of 상위클래스
◦
is a 관계를 추천하지 않는 이유: “하위 클래스는 하나의 상위클래스”라는 의미가 되어 하위 클래스가 객체처럼 취급되어버림. 하나의 클래스란 하나의 객체이기 때문.
◦
is a kind of 관계를 추천하는 이유: “하위 클래스는 상위 클래스의 한 부류”라는 의미가 되어 하위 클래스가 분류/집단(클래스)임을 명확히 드러냄.
▪
ex) Dog is a kind of animal.
•
다중 상속과 자바
•
상속과 인터페이스
•
상속과 UML 표기법
•
상속과 T 메모리
6. 다형성(사용편의성)
•
오버라이딩 vs 오버로딩
◦
오버라이딩(올라타기)(재정의): 맨 위에 올라탄 존재만 보임
▪
같은 메서드 이름, 같은 인자 목록으로 상위 클래스의 메서드를 재정의
◦
오버로딩(적재하기)(중복정의): 옆으로 적재된 모든 적재물이 다 보임
▪
같은 메서드 이름, 다른 인자 목록으로 다수의 메서드를 중복 정의
•
다형성과 T 메모리
•
오버라이딩 장점
◦
상위 클래스 타입의 객체 참조 변수에서 하위 클래스가 오버라이딩한 메서드를 자동으로 호출해줌.
class Driver {
public static void main(String[] args) {
동물[] 동물들 = new 동물[5];
동물들[0] = new 쥐();
동물들[1] = new 고양이();
동물들[2] = new 강아지();
동물들[3] = new 송아지();
for(int i=0; i<동물들.length; i++) {
동물들[i].울어보세요();
}
}
}
Java
복사
◦
동물들[i]는 동물 클래스 타입인데, 동물 클래스(상위)의 울어보세요() 메서드가 아닌 쥐, 고양이, 강아지, 송아지 클래스(하위) 타입에 맞는 울어보세요() 메서드가 호출됨. 하위 클래스가 상위 클래스의 메서드 오버라이딩 했기 때문임.
•
오버로딩 장점
◦
함수명 하나만 가지고 인자 목록만 달리하면 돼서 편리함. 만일 오버로딩 지원안하는 언어였다면 인자 목록 달라질 때마다 새로운 이름의 함수 만들어야 함.
7. 캡슐화(정보 은닉)
•
접근 제어자와 UML 표기법: private(-), protected(#), public(+), [default](~)
•
객체 멤버의 접근 제어자
•
정적 멤버(클래스 멤버)의 접근 제어자
•
참조 변수의 복사