Java/JavaCafe Study

3주차 객체지향

향찡 2021. 6. 5. 21:40

발표자 : 최용호

발표 자료 + 강의 내용 부연 설명 정리

예제 코드

https://github.com/HyangKeunChoi/javacafe-oop

 

HyangKeunChoi/javacafe-oop

자바 카페 커뮤니티의 객체지향 강의 예제입니다. Contribute to HyangKeunChoi/javacafe-oop development by creating an account on GitHub.

github.com

객체지향 프로그래밍 (OOP : Object-Oriented Programming)

  • 객체 지향 프로그래밍(영어: Object-Oriented Programming, OOP)은 컴퓨터 프로그래밍의 패러다임의 하나이다.
  • 컴퓨터 프로그램을 명령어의 목록으로 보는 시각에서 벗어나 여러 개의 독립된 단위, 즉 "객체"들의 모임으로 파악하고자 하 는 것이다.
  • 각각의 객체는 메시지를 주고받고, 데이터를 처리할 수 있다.

객체(Object)란?

  • 실세계와 비교하자면 세상에 존재하는 모든 사물이 객체
  • 저장 공간에 할당된 공간
    • 객체 참조 변수를 통해 해당 공간에 접근
  • 하나의 클래스를 통해 다수의 객체가 생성되지만 각각의 객체는 고유함.
  • 속성 + 행위

클래스(Class) 란?

  • 같은 속성들과 기능들을 가진 객체들을 총칭하는 개념
    • 이 개념적인 클래스를 통해 실체화 된 것이 객체(인스턴스).
  • 객체는 필드(Field)와 메소드(Method)를 가진다
    • 클래스를 통해 실체화된 객체는 필드를 통해 고유한 속성을 가지고 메소드로 행위를 한다.

필드(Field)

  • 라이프 사이클
    • 필드는 객체 소멸 시 함께 소멸
    • 변수는 생성자 또는 메서드 수행이 종료되면 소멸
  • 초기화
    • 필드 선언 시
      • 필드의 초기 값이 모든 객체에 대해 동일한 경우
    • 생성자에서
      • 객체 생성 시점에 외부의 값으로 대입이 필요한 경우

생성자

  • new 연산자로 호출되며, 객체 생성 시 초기화를 담당.
    • 클래스 이름으로 되어 있고 리턴 타입이 없다
  • 명시하지 않으면 JVM이 기본 생성자 생성.
  • 상속 관계에서 객체 생성은 상위 클래스가 먼저 초기화되고 하 위 클래스가 초기화된다.

메소드 (Method)

객체의 동작에 해당하며 해당 객체의 필드를 읽고 수정하는 역할과 객체 간의 상호작용 역할

  • 선언부와 실행 블록으로 구성
    • 선언부를 시그너처라고도 한다.
    • 시그너처 : 반환 타입, 메서드명, 매개변수

메모리 영역

크게 메소드 / 스택 / 힙 영역으로 구성된다.

메소드영역

클래스 정보는 메서드 영역에서 관리된다.

한번 선언되면 해지되지 않는 고정되는 값들이 메소드 영역에 올라간다

고유한 객체들은 힙 영역에 올라간다.

참조되지 않는 값들은 메모리에 남아 있을 필요가 없으므로 GC의 대상이 된다.

예를 들어

자동차 mycar = new 자동차();

스택

메소드가 호출되는 시점에 스택에 프레임이 만들어진다.

프레임안에 지역변수가 스택 자료구조 형태로 저장된다.

객체 vs 클래스

  • 클래스는 메소드 영역에
  • 객체는 힙 영역에
  • 객체의 메소드가 수행되면 스택 프레임이 생성
  • 메소드 내의 지역변수들은 스택 프레임의 스택에 쌓임

객체지향의 4대 특성

  • 캡슐화 (Encapsulation)
  • 상속(inheritance)
  • 추상화(Abstraction)
  • 다형성(Polymorphism)

캡슐화 (Encapsulation)

  • 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 함
    • 정보 은닉
  • 변화에 유연한 대응

Getter / Setter

  • 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는 것을 막는다.
  • 객체의 데이터를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성이 깨어질 수 있기 때문에 외부에서 직접적으로 접근하는 것을 막는다.

상속 (inheritance)

  • 상속의 목적은 재사용과 확장
  • 상위 객체를 재사용해서 하위 객체를 쉽고 빨리 설계할 수 있도록 도와준다.
  • 이미 잘 개발된 객체를 재사용해서 새로운 객체를 만들기 때문 에 중복 코드를 줄여준다.

is a 관계

  • 하위 클래스는 상위 클래스이다. (LSP – 리스코프 치환 원칙)

상속에서의 메모리

  • 하위 클래스를 생성하면 메모리에 상위 클래스도 함께 적재된다.

다중 상속

  • 자바에서는 다중 상속을 지원하지 않는다.
    • 다이아몬드 상속 문제 때문
  • 사람과 물고기를 확장하고 있는 인어에게 수영을 해보라고 한다면? 사람처럼 다리로 해야 할지, 물고기처럼 지느러미로 해야 할지 알 수 없음.
  • 이를 위해 다이아몬드 상속 문제를 일으키지 않는 인터페이스를 제공

인터페이스 (interface)

  • 다중 상속 가능.
  • 인터페이스의 메서드들은 전부 추상 메서드
  • 모든 메서드는 기본적으로 public 접근 제한
  • 하위 클래스에서는 implements 키워드를 사용하여 인터페이스를 구현
  • 일반 클래스처럼 new 키워드로 생성될 수 없음
  • 인터페이스들끼리의 상속 가능
  • 인터페이스도 결국에는 컴파일러를 통해 .class 파일로 생성되기 때문에 물리적인 형태는 클래스와 동일

인터페이스 구성 요소

  1. 상수 필드(Constant Field)
  2. 추상 메소드(Abstract Method)
  3. 디폴트 메소드(Default Method)
  4. 정적 메서드(Static Method)

추상화 (Abstraction)

  • 구체적인 것을 분해해서 관심 영역에 대한 특성만을 가지고 재조합 하는 것.
    • 관심영역 = 어플리케이션 경계 = 도메인 = 컨텍스트

추상 클래스 (Abstract Class)

  • 추상 클래스 (Abstract Class)
  • Class 앞에 abstract 키워드를 붙여서 표현
  • Abstract와 final 키워드는 함께 사용할 수 없다. (abstract는 변경되도록 하고 final은 변경되지 못하게 하므로 서로 상충됨)
  • Abstract 메서드는 하위 클래스에서 반드시 구현해야 함
  • 일반 클래스처럼 new 키워드를 사용하여 생성할 수 없음.

추상클래스 vs 인터페이스 차이

  • 추상 클래스는 extends, 인터페이스는 implements 키워드 사용
  • 추상 클래스는 필드를 가질 수 있지만 인터페이스는 불가능
    • Static 변수는 가질 수 있음
  • 추상 클래스도 클래스이기 때문에 다중 상속이 불가능
  • 다중 상속이 불가능한 제약을 인터페이스로 해결
    • 인터페이스는 메서드의 구현 부분과 필드가 없기 때문에 다중 상속 가능
  • 추상 클래스는 클래스를 상속받아서 기능을 이용하거나 확장하는 목적
  • 인터페이스는 메서드 구현을 강제하여 하위 클래스에게 같은 동작을 행하도록 함

어떤 것을 사용할 것인가?

추상 메소드만으로 가능한 경우에는 인터페이스를, 공통된 구현 부분이나 필드가 필요한 경우에는 추상 클래스를

다형성 (Polymorphism)

  • 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질
  • 하위 클래스는 상위 클래스나 인터페이스로 자동 타입 변환이 가능
  • 하위 클래스로 생성된 인스턴스는 하위 클래스의 객체 참조 변수에 대입되나 상위 클래스의 객체 참조 변수에 대입되나 같은 주소를 가리킨다.
    • sub == super (객체 간 == 연산자는 주소 비교)
    • 상위 클래스로 변환된 경우 상위 클래스에 선언된 필드와 메서드에만 접근 가능
  • 강제 타입 변환(Casting)
    • 상위 클래스를 하위 클래스로 강제 변환
    • instanceof로 상속관계가 맞는지 확인
    • 확인 없이 다른 클래스로 캐스팅하면 ClassCastException 발생

오버라이딩 (Overriding)

  • 상속된 메소드의 내용이 하위 클래스에 맞지 않을 경우, 하위 클 래스에서 동일한 메소드를 재정의 하는 것
  • 상위 클래스의 메소드는 숨겨지기 때문에 메서드 호출 시 하위 클래스의 메서드가 호출된다.

오버 로딩 (Overloading)

  • 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
  • 오버 로딩된 메소드를 호출할 경우 JVM은 매개 값의 타입을 보고 메소드를 선택

static

  • 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
  • static 필드와 메서드는 클래스에 고정된 멤버이므로 클래스로 더가 클래스(바이트 코드)를 로딩해서 메서드 메모리 영역에 적재할 때 클래스별로 관리된다
    • 클래스 로딩이 끝나면 바로 사용 가능
  • static 요소들은 클래스 이름으로 접근하는 것이 좋다
  • static 필드는 선언과 동시에 초기값을 주는 것이 보통이지만 초 기화 과정이 복잡한 경우 static 블럭을 사용할 수 있다.

final

  • 초기값이 저장되면 프로그램 실행 도중 수정할 수 없다
  • static final로 상수 선언
  • 상수 이름은 모두 대문자로 하는 것이 관례
    • 예 : Math.PI

package

  • 클래스를 체계적으로 관리하기 위해 사용
  • 클래스를 유일하게 만들어주는 식별자 역할
  • 컴파일러는 클래스에 포함되어 있는 패키지 선언을 보고 파일 시스템의 폴더를 자동 생성
  • 모두 소문자로 하는 것이 관례
  • 숫자로 시작하면 안 되고 _,$를 제외한 특수문자 사용 불가능
  • java로 시작하는 패키지는 자바 표준 API에서만 사용하므로 사용 불가
  • 보통 회사들 간에 패키지 중복을 피하기 위해 회사 도메인 이름으로 패키지를 만든다.