[Java] 객체지향 4대 특성

szlee·2023년 10월 26일
0

Java

목록 보기
7/23

객체 지향 4대 특성

  • 캡슐화 : 정보은닉
  • 상속 : 재사용
  • 추상화 : 모델링
  • 다형성 : 사용편의



클래스와 객체의 관계

클래스와 객체의 관계는 붕어빵틀과 붕어빵이 아니다!
클래스 객체명 = new 클래스();
붕어빵틀 붕어빵 = new 붕어빵틀();
새로운 붕어빵틀을 하나 만들었더니 붕어빵이 되었다?
말이 안된다!

⭐️클래스는 분류에 대한 개념이고, 객체는 실체다.⭐️
클래스 : 객체 = 펭귄 : 뽀로로 = 사람 : 김연아 다.



추상화 : 모델링

구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합.
=> 구체적인 것을 분해해서 관심영역(애플리케이션 바운더리)에 있는 특성만 가지고 재조합하는 것(모델링)
객체지향에서 추상화의 결과는 클래스이다.
자바가 객체 지향의 추상화를 지원하는 방법? class 키워드

추상화와 메모리

public class Mouse{

  public String name;
  public int age;
  public int countOfTail;

  public void sing(){
  	System.out.pringln(name + "찍찍");

  }
}



public class MouseDriver {

  public static void main(String[] args) {
    Mouse mickey = new Mouse();
    mickey.name = "미키";
    mickey.age = 3;
    mickey.countOfTail = 1;

    mickey.sing();

    mickey = null;
  }
}

java.lang 패키지와 모든 클래스들(Mouse, MouseDriver)이 메모리의 스태틱 영역에 배치된다.

Mouse에서 name, age, countOfTailMouse 클래스에 속한 속성이 아니라 Mouse 객체에 속한 속성이므로 객체가 생성돼야만 속성의 값을 저장하기 위한 메모리 공간이 힙 영역에 할당된다.

스택 프레임 속 객체 참조 변수가 영역의 객체를 참조한다.
= 객체 참조 변수는 객체의 주소를 가지고 있다.

Mouse mickey = new Mouse();

// 한 마리 쥐가 태어났으니 그 이름을 mickey라 하였다.
// 쥐 : 클래스
// 한 마리 쥐 : 클래스의 인스턴스 = 객체
// mickey : 객체 참조 변수

mickey = null;
코드가 실행된 후에는 객체 참조 변수 mickey가 더 이상 영역의 객체를 참조하지 않으므로 가비지 컬렉터가 이를 수거해간다.

모든 객체가 모두 같은 값을 갖는 속성이 있다?
static키워드를 통해 스태틱 영역에 단 하나의 저장 공간을 갖게 하자.
public static int countOfTail = 1;


  • static 변수 (= 클래스 속성, 정적 변수) - 스태틱 영역에 산다.
  • 인스턴스 변수 (= 객체 속성, 객체 변수) - 힙 영역에 산다.
  • local 변수 (= 지역 변수) - 스택 영역(스택 프레임 내부)에 산다.


상속 : 재사용 + 확장

상속의 개념은 조직도나 계층도가 아니라 분류도다!
상속보단 확장이라는 단어가 더 맞다!

상위 클래스 - 추상화, 일반화
하위 클래스 - 구체화, 특수화
하위클래스는 상위클래스다 -- 이게 성립되어야함.

딸은 엄마이다 (x) 부모 자식 관계로 생각하지 말고
펭귄은 동물이다 (o) 분류와 확장으로 생각하기.

extends 키워드 사용

자바는 다중 상속 허용하지 않는다, 대신 인터페이스라는 개념이 있다.

  • 다중 상속의 문제점 ex 인어공주..

⭐️상위 클래스는 하위 클래스에게 특성(속성, 메서드)을 상속해주고
인터페이스는 클래스가 '무엇을 할 수 있다'라고 하는 기능을 구현하도록 강제하게 된다.⭐️

public interface 날수있는 {
	void fly();
}

상위 클래스는 물려줄 특성이 풍성할수록 좋다.
인터페이스는 구현을 강제할 메서드의 개수가 적을수록 좋다.

상속과 메모리

하위 클래스의 인스턴스가 생성될 때 상위 클래스의 인스턴스도 함께 생성된다.
-> 하위 클래스의 인스턴스만 영역에 생긴 게 아니라 상위 클래스의 인스턴스도 함께 영역에 생긴다.

public class Penguin extends Animal{ 
public String habitat;

public void showHabitat() {
	System.out.println(habitat);
}
Penguin pororo = new Penguin();
Animal pingu = new Penguin();

pingu의 객체 참조 변수는 펭귄이면서 기억 상실에 걸린건지 자신이 펭귄이라는 사실을 모르고 있다.
다만 자신이 동물이라는 것만 인식하고 있다.
따라서 핑구 객체 참조 변수는 펭귄의 서식지 속성과 서식지를 알려주는 메서드를 사용할 수 없다.

Penguin happyfeet = new Animal();

결과 : incompatible types: Animal cannot be converted to Penguin



코드를 읽을 땐 인간의 언어로 번역하며 읽자.

Penguin pororo = new Penguin();
// 펭귄 한 마리가 태어나니(new Penguin()) 펭귄 역할을 하는(Penguin) pororo라 이름 지었다.
pororo.name = "뽀로로";
// pororo의 name을 "뽀로로"라 하자.
pororo.habitat = "남극";
// pororo의 habitat를 "남극"이라 하자.
pororo.showName();
// pororo야 너의 이름을 보여다오.
pororo.showHabitat();
// pororo야 너의 서식지를 보여다오.


다형성 : 사용편의성

객체 지향에서 다형성 : 오버라이딩, 오버로딩

  • 오버라이딩 : 재정의. 상위클래스의 메서드와 같은 이름, 같은 인자 리스트
  • 오버로딩 : 중복정의. 같은 메서드 이름, 다른 인자 리스트

상위클래스 타입의 객체 참조 변수를 사용하더라도 하위 클래스에서 오버라이딩(재정의)한 메서드가 호출된다.



캡슐화 : 정보 은닉

  • public : 모두 접근 가능
  • protected : 상속/같은 패키지 내의 클래스에서 접근 가능
  • default : 같은 패키지 내의 클래스에서 접근 가능
  • private : 본인만 접근 가능

  • Call By Value : 값을 값 자체로 판단
  • Call By Reference : 값을 주소(포인터로 판단)




스프링 입문을 위한 자바 객체지향의 원리와 이해

profile
🌱

0개의 댓글