3장 자바와 객체 지향

Seunghee Ryu·2023년 11월 19일
0
  • 객체 지향에 대한 설명과 객체 지향의 4대 특성에 대해 알아보는 챕터

객체지향

  • 프로그래밍 언어는 개발자를 편하고 이롭게 하기 위해서 발전해왔다
  • 객체지향 역시 기계 종속적으로 개발하는 것이 아니라 인간이 인지하기 더 편한 사고 체계를 끌여들어 개발을 더 수월하게 하기 위해 만들어졌다

구조적 프로그래밍 언어 vs 객체 지향

  • 구조적 프로그래밍 언어는 D&C(Divide and Conquer)를 중심으로 생각했다. 즉, 문제를 작은 조각들로 나누어 하나씩 해결하는 방식으로 함수가 가장 중요했다
  • 객체 지향은 우리가 주변 사물을 인지하는 방식대로 프로그래밍 하는 것이며 컴퓨터에 맞춰 사고하지 않고 현실 세계를 인지하는 방식으로 프로그램을 만든다. 그렇기 때문에 직관적이다.

객체 지향의 사물 인지 방식

  • 세상에 존재하는 모든 것은 사물 즉 객체
  • 각각의 사물은 고유하다
  • 사물은 속성을 가진다
  • 사물은 행위를 한다
  • 이 사물을 하나하나 이해하는 것보다 사물을 분류(class)해서 이해하는 것이 인간의 인지법

클래스 vs 객체

  • 클래스는 분류에 대한 개념이고 객체(Object, Instance)는 실체

객체 지향의 4대 특성

  1. 캡슐화
  2. 상속(재사용)
  3. 추상화
  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"); // sehun 안녕, 나는 뽀로로라고 해
		pororo.showHabitat(); // 뽀로로는 남극에 살아

		Animal pingu = new Penguin();

		pingu.name = "핑구";
    pingu.showName(); // 어머 내 이름은 알아서 뭐하게요?
  }
}

  • 오버라이딩을 통한 메서드 재정의, 오버로딩을 통한 메서드 중복 정의를 통해 다형성을 제공하고 이 다형성이 사용편의성을 제공한다

캡슐화 : 정보 은닉

  • 상속을 받지 않았다면 객체 멤버는 객체를 생성한 후 객체 참조 변수를 이용해서 접근해야 한다
  • 정적 멤버는 클래스명 정적 멤버 형식으로 접근하는 것을 권장한다
  • call by value : 값이 복사되며 변수가 서로 영향을 주지 않음
  • call by reference : 주소가 복사되며 변수가 서로 영향을 줌

0개의 댓글