본문 바로가기
Backend boot camp/Session1

[JAVA] 객체 지향 프로그래밍 심화

by orioncsy 2022. 9. 6.

0. 상속(Inheritance)

개요

  • 학습 목표
    • 상위 클래스-하위 클래스의 상속 관계 이해
    • extends 키워드로 상속 관계 정의
    • 포함관계 상속관계 차이
    • 상속관계에서 메서드 오버 라이딩
    • super와 super() 차이
    • Object 클래스가 자바 클래스의 상속계층도에서 최상위

상속

  • 상속
    • 기존의 클래스를 재활용해 새로운 클래스 작성
    • 상위 클래스와 하위 클래스로 나뉘어 멤버를 공유
    • 하위 클래스 멤버 개수는 상위랑 같거나 크다
    • 코드를 재사용하여 적은 양의 코드로 새로운 클래스 생성
    • 하나의 객체가 여러 모양으로 표현되는 다형성이 가능
  • 코드 예제
    • 클래스명 extends 상위 클래스로 정의
    • 단일 상속만 가능(인터페이스를 이용해 비슷한 효과 가능)

포함 관계

  • 포함 관계
    • 클래스 멤버로 다른 클래스 타입의 참조 변수를 사용하는 것
    • 클래스 간 관계는 포함관계가 대다수이다
  • 상속과 구분 방법
    • Is -A(이다) : 상속
    • Has -A(가지고 있다) : 포함 관계

메서드 오버 라이딩

  • 메서드 오버 라이딩(method overriding)
    • 상위 클래스로부터 상속받은 메서드를 동일한 이름의 메서드로 재정의
  • 메서드 오버 라이딩 조건
    • 메서드의 선언부(메서드 이름, 매개변수, 반환 타입)가 상위 클래스와 일치
    • 접근 제어자의 범위가 상위 클래스 메서드보다 같거나 넓어야 함
    • 예외는 상위 클래스보다 많이 선언할 수 없다
  • 상위 클래스 타입을 선언
    • 배열을 통해 관리가 편하다
  • super 키워드와 super()
    • 상위 클래스의 변수를 참조할 때 super 사용
    • super()는 상위 클래스의 생성자를 호출
    • 생성자 첫 줄에는 this()나 super()가 첫 줄에 존재해야 한다

클래스의 정점, Object 클래스

  • Object 클래스가 최상의 클래스
    • 상속받지 않아도 자동적으로 Object 클래스 extends
    • Object 클래스 멤버 자동 상속
  • Object 클래스 메서드
    • 기본적으로 사용 가능
      • toString(), equals(), hashCode(), wait(), notify()

1. 캡슐화(Encapsulation)

개요

  • 학습 목표
    • 캡슐화 개념과 목적 이해
    • 패키지 개념과 import문 사용 방법
    • 캡슐화를 위한 접근제어자 4가지
    • 데이터 보호를 위한 getter/setter 메서드

캡슐화

  • 캡슐화
    • 특정 객체 안에 속성과 기능을 캡슐로 만들어 데이터 보호
  • 목적
    • 데이터 보호(정보은닉)
    • 데이터의 불필요한 외부 노출 예방

패키지

  • 패키지
    • 특정 목적을 위해 클래스나 인터페이스를 묶은 것
    • 효과적으로 관리
  • 대표적인 패키지
    • java.lang : 기본 패키지
    • java.util : 확장 클래스
    • java.io/java.nio : 입출력
  • 선언 방식
    • package practicepack.test;
  • 클래스 충동 방지
    • 같은 클래스명을 사용해도 다른 패키지이면 가능

Import문

  • import문
    • 다른 패키지 내의 클래스를 사용하기 위해 사용
  • 선언 방식
    • package문과 class문 사이에 작성
    • import 패키지명. 클래스명; or import 패키지명.*;
  • 장점
    • 다른 패키지의 클래스를 사용할 때 전체 패키지 이름을 적지 않아도 된다
    • ex) package.test.Example → Example

접근제어자

  • 제어자(modifier)
    • 접근 제어자 : public, protected, (default), private
    • 기타 제어자 : static, final, abstract, native, transient, synchronized
    • 하나의 대상에 여러 제어자 사용 가능
    • 접근 제어자는 한 번만 사용 가능
  • 접근 제어자(Access modifier)
    • 외부로부터 데이터 변경을 방지
    • private : 동일 클래스 내 접근
    • default : 동일 패키지 내 접근
    • protected : 동일 패키지 + 외부 하위 클래스 접근
    • public : 접근 제한 없음

getter와 setter 메서드

  • private으로 제어된 필드 값을 다른 클래스에서 접근할 때
    • getter : 값을 불러오기 (메서드명 : get-)
    • setter : 값을 저장 (메서드명 : set-)

2. 다형성(polymorphism)

개요

  • 학습 목표
    • 다형성의 의미, 장점
    • 참조 변수의 타입 변환(업 캐스팅, 다운 캐스팅)
    • instanceof 연산자
    • 다형성 활용

다형성

  • 다형성
    • 하나의 객체가 다양한 형태의 성질을 가질 수 있는 것
    • overloading, overriding 모두 다형성의 예
  • 상위 클래스 = new 하위 클래스
    • 하위 클래스의 멤버 수가 더 많아서 사용할 수 있는 기능이 줄어들지만 가능
    • 역으로는 불가능하다(실제로 구현이 안되는 기능도 있기 때문)

참조 변수의 타입 변환

  • 참조 변수의 타입 변환
    • 사용할 수 있는 맴버 개수 조정
  • 타입 변환 조건
    • 상속 관계에 있는 경우만 가능
    • 하위에서 상위로 업 캐스팅은 형 변환 연산자()를 생략 가능
    • 상위에서 하위로 다운 캐스팅 형 변환 연산자 필수

instanceof 연산자

  • instanceof
    • 참조 변수 캐스팅이 가능한지 여부를 boolean으로 반환
  • 사용 방법
    • 참조 변수 instanceof 타입
    • 캐스팅 가능하면 true, 아니면 false
    • 참조 변수가 null이면 false

3. 추상화(Abstraction)

개요

  • 학습 목표
    • 추상화 개념과 목적
    • abstrct 제어자 의미
    • 추상 클래스 개념, 문법
    • final 키워드
    • 추상화 역할을 하는 interface
    • 추상 클래스와 인터페이스 차이

추상화

  • 추상화 개념과 목적
    • 객체의 공통적 속성과 기능 추출
    • 하위 클래스들의 공통적 특성을 모아 상위 클래스를 만든다

abstract 제어자

  • abstract 사용
    • abstract 메서드(추상 메서드), abstract class(추상 클래스)
    • 하나의 메서드가 추상 메서드이면 그 클래스는 추상 클래스
  • abstract 특징
    • 추상 메서드는 시그니처만 있고 바디에 내용이 없다
    • 객체 생성 불가

추상 클래스

  • 사용 목적
    • 새로운 클래스 생성에 용이
    • 구체적인 내용은 하위 클래스에서 구현(오버 라이딩 사용)
  • 상층부에 갈수록 공통된 속성이 많다

final 키워드

  • final
    • 선언 위치에 따른 효과
    • 클래스 : 변경 불가능한 클래스, 상속 불가
    • 메서드 : 오버라이딩 불가
    • 변수 : 상수 취급(값 변경 불가)

인터페이스

  • 인터페이스
    • 추상 클래스 : 추상 메서드 하나 이상 포함
    • 인터페이스 : 추상 메서드와 상수만 멤버로 갖는다
  • 인터페이스 기본 구조
    • class 대신 interface 키워드를 사용
    • 내부 모든 필드가 public static final
    • 내부의 모든 메서드가 public abstract
    • 생략 가능
  • 인터페이스 구현
    • extends 대신 implements 사용
    • 인터페이스 내 모든 추상 메서드를 구현 필수
  • 인터페이스 다중 구현
    • 하나의 클래스가 다중의 인터페이스 구현 가능
    • class 클래스 이름 implements 인터페이스1, 인터페이스2, 인터페이스3{…}
    • 클래스는 동일한 필드나 이름으로 충돌이 가능하여 다중 상속이 불가
    • 인터페이스는 미완성된 메서드로 충돌이 일어날 여지가 없기 때문에 가능
    • 상속과 인터페이스 구현 동시에 가능
  • 인터페이스 장점
    • 기능을 가지는 역할과 구현을 분리시켜 코드 변경을 용이하게 함
    • 개발 시간 단축
    • 다른 클래스에 미치는 영향을 최소화