전체 보기
📕

[자바 객체 지향] Chapter 3. 자바와 객체 지향

작성일자
2022/09/07
태그
SUB PAGE
프로젝트
자바 객체 지향
책 종류
1 more property

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: 인간의 논리라 객체 지향적
Driver03.java → 상속의 장점 3: 반복문 효과 극대화 (서로 다른 클래스의 객체들 한 번에 접근 가능)
하위 클래스 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](~)
객체 멤버의 접근 제어자
정적 멤버(클래스 멤버)의 접근 제어자
참조 변수의 복사