[Java] 객체 지향 프로그래밍 - 다형성(Polymorphism)

2025. 11. 24. 17:30·Language/Java
반응형

 

1️⃣ 데이터 은닉과 보호 (Encapsulation)

  • 정보를 보호하기 위한 대책
    • 변수는 private 접근으로 막기
      • public은 모두에게 열려있기 때문에 누군가 정보를 바꿀 수 있다
      • private은 같은 클래스 안에서만 쓸 수 있다
    • 공개되는 메서드를 통한 접근 통로 마련: setter / getter
      • 메서드에 정보 보호 로직 작성

 

🔹 객체의 생성 제어

  • 여러 개의 객체가 필요 없는 경우
    • 객체를 구별할 필요가 없는 경우 = 수정 가능한 멤버 변수가 없고 기능만 있는 경우
    • 이런 객체를 stateless한 객체라고 한다.
  • 객체를 계속 생성/삭제하는데 많은 비용이 들어서 재사용이 유리한 경우

 

🔹 Singleton 디자인 패턴

  • 외부에서 생성자에 접근 금지 → 생성자의 접근 제한자를 private으로 설정
  • 내부에서는 private에 접근 가능하므로 직접 객체 생성 → 멤버 변수이므로 private 설정
  • 외부에서 private member에 접근 가능한 getter 생성 → setter는 불필요
  • 객체 없이 외부에서 접근할 수 있도록 getter와 변수에 static 추가

 


 

2️⃣ 다형성 (Polymorphism)

하나의 객체가 많은 형(타입)을 가질 수 있는 성질

  • 상속 관계에 있을 때 조상 클래스의 타입으로 자식 클래스 객체를 레퍼런스할 수 있다.

 

🔹 다형성의 활용

  1. 다른 타입의 객체를 다루는 배열
    • 배열의 특징 - 같은 타입의 데이터를 묶음으로 다룬다
    • 다형성으로 다른 타입의 데이터를 하나의 배열로 관리
    • Object는 모든 클래스의 조상
      • Object의 배열은 어떤 타입의 객체라도 다 저장할 수 있음
    • 자바의 자료구조를 간단하게 처리할 수 있음
      • Collection API
  2. 매개변수의 다형성
    • 조상을 파라미터로 처리한다면 객체의 타입에 따라 메서드를 만들 필요가 없어진다
    • API에서 파라미터로 Object를 받는다는 것은 모든 객체를 처리한다는 말이다

 


 

3️⃣ 객체의 형 변환

🔹 다형성과 참조형 객체의 형 변환

  • 메모리에 있는 것과 사용할 수 있는 것의 차이
    • 메모리에 있더라도 참조할 수 있는 변수의 타입에 따라 접근할 수 있는 내용이 제한됨

 

🔹 참조형 객체의 형 변환

  • 하위 타입을 상위 타입으로 변환 → 묵시적 캐스팅
    • 자손 타입의 객체를 조상 타입으로 참조 : 형 변환 생략 가능
      • 조상의 모든 내용이 자식에 있기 때문에 걱정할 필요는 없다
  • 상위 타입을 하위 타입으로 형 변환 → 명시적 캐스팅
    • 조상 타입을 자손 타입으로 참조 : 형 변환 생략 불가
  • 조상을 무작정 자손으로 바꿀 수는 없다
    • 메모리의 객체는 자손타입의 메소드가 없기 때문
    • instanceof 연산자
      • 실제 메모리에 있는 객체가 특정 클래스 타입인지 boolean으로 리턴

 

4️⃣ 정적 바인딩과 동적 바인딩

참조 변수의 레벨에 따른 객체의 멤버 연결 ⭐

  • `superClass.method()`를 했을 때 superClass의 메서드가 호출될 거 같지만 이미 Override한 상태라면 subClass.method()가 호출된다.

 

정적 바인딩 (static binding)

  • 컴파일 단계에서 참조 변수의 타입에 따라 연결이 달라짐
  • 상속 관계에서 객체의 멤버 변수(static/instance)가 중복될 때 또는 static method

 

동적 바인딩 (dynamic binding)

  • 다형성을 이용해서 메서드 호출이 발생할 때 runtime에 메모리의 실제 객체의타입으로 결정
  • 상속 관계에서 객체의 instance method가 재정의되었을 때 마지막에 재정의된 자식 클래스의 메서드가 호출됨
    • 최대한 메모리에 생성된 실제 객체의 최적화된 메서드가 동작한다
String name이 겹칠 때는 부모 클래스의 name이 출력되지만 func() 메서드 가 겹칠 때는 자식 클래스의 func()가 실행된다 (→ 동적 바인딩)

 

객체가 출력되는 과정

  • System.out.print(Object obj)를 이용한 객체 출력
  • PrintStream의 print 메서드
  • String의 valueOf
  • Obejct의 toString

 


 

5️⃣ Object 메서드 재정의

Object 클래스

  • 가장 최상위 클래스로 모든 클래스의 조상
    • Object의 멤버는 모든 클래스의 멤버

 

toString 메서드

  • 객체를 문자열로 변경하는 메서드
  • 정작 궁금한 내용은 주소값 따위가 아닌 내용

 

equals 메서드

  • 두 객체가 같은지를 비교하는 메서드
  • 두 개의 레퍼런스 변수가 같은 객체를 가리키고 있는가?
    • 객체의 주소 비교: `==`
    • 객체의 내용 비교: `equals`

 

hashCode (파이썬에서 set 같은 거)

  • 객체의 해시 코드: 시스템에서 객체를 구별하기 위해 사용되는 정수 값
  • equals 메서드를 재정의할 때는 반드시 hashCode도 재정의할 것
    • HashSet, HashMap 등에서 객체의 동일성을 확인하기 위해 사용
    • Object class에 정의된 hashCode: `public native int hashCode();`
      • 미리 작성된 String이나 Number 등에서 재정의된 hashCode 활용 권장
      • `native`는 함수의 구현이 c언어로 되어 있어 빠르다
반응형
'Language/Java' 카테고리의 다른 글
  • [Java] 객체 지향 프로그래밍 - 상속(Inheritance)
  • [Java] 객체 지향 프로그래밍 - 추상화(Abstraction)
  • [Java] 자바 기본 문법 총정리
  • [Java] 클래스와 데이터
올콩
올콩
콩 심은 데 콩 난다
  • 올콩
    콩스토리
    올콩
  • 전체
    오늘
    어제
    • 분류 전체보기 (213) N
      • SSAFY (10)
      • Algorithm (122)
        • 이론 (6)
        • 백준 (BOJ) (114)
        • 프로그래머스 (1)
        • 코드트리 (1)
      • Trouble Shooting (11)
      • Frontend (7)
      • React (17)
      • Next.js (5)
      • Vue (4)
      • Node.js (2)
      • HTML (9)
      • DevOps (4)
        • Git (4)
      • Language (13) N
        • JavaScript (0)
        • Java (13) N
      • Embedded (1)
      • CS (5)
        • Network (1)
        • Blockchain (4)
      • 자격증 (2)
      • 기타 (1)
        • Tistory (1)
  • 블로그 메뉴

    • GitHub
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Algorithm
    중복순열
    싸피
    파이썬
    힙
    SSAFYcial
    백준
    React
    브루트포스
    DP
    구현
    수학
    Heap
    Java
    재귀
    html5
    티스토리챌린지
    그리디
    블록체인
    알고리즘
    bfs
    우선순위큐
    Next.js
    Error
    백트래킹
    SSAFY
    강의
    순열
    dfs
    오블완
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
올콩
[Java] 객체 지향 프로그래밍 - 다형성(Polymorphism)
상단으로

티스토리툴바