Java

[Java]객체지향 프로그래밍 II

patrck_jjh 2025. 4. 6. 17:51

 

 

 

1. 상속(inheritance)

 

1.1 상속이란?

  • 기존의 클래스 재사용하여 새로운 클래스 작성하는 것
  • 두 클래스를 조상과 자손으로 관계를 맺음 
  • extends 키워드로 상속함 
  • 생성자와 초기화 블럭은 상속되지 않고 멤버만 상속
  • 자손 클래스의 멤버 개수 >= 조상 클래스의 멤버 개수(extends)

 

 

1.2 클래스간 관계

상속관계(inheritance)

  • 공통부분은 조상에서 관리하고 개별부분은 자손에서 관리
  • 조상의 변경은 자손에 영향을 줌
  • A는 B이다(is-a)

 

포함관계(composite)

  • 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언
  • 작은 단위의 클래스를 먼저 만들고 이를 조합해 하나의 커다란 클래스 생성 
  • A는  B를 가지고 있다.(has-a)

 

 

1.3 단일 상속(single inheritance)

  • Java는 단일 상속만을 허용
  • 포함관계 및 인터페이스를 활용해 다중상속 효과를 낼 수 있다

 

 

1.4 Object 클래스 

  • 모든 클래스 상속계층도의 최상위 조상클래스(superclass)
  • toString(), equals(), hashCode(), getClass() 등 메서드를 가짐 

 

 


 

2. 오버라이딩(overriding)

 

2.1 오버라이딩이란?

상속받은 메서드의 내용을 상속받는 클래스에 맞게 변경하는 것 

@Override 애노테이션으로 명시 가능

 

 

오버로딩 vs 오버라이딩 

 

오버로딩

기존에 없는 새로운 메서드를 정의(new)

 

오버라이딩

상속받은 메서드의 내용을 변경(change)

 

 

2.2 오버라이딩 조건

  • 메서드 내용만을 새로 작성하는 것이기 때문에 선언부는 같아야함
  1. 이름이 같아야 한다
  2. 매개변수가 같아야 한다
  3. 반환타입이 같아야 한다 
  • 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경 불가
  • 조상 클래스의 메서드보다 많은 수의 예외 선언 불가
  • 인스턴스메서드 <-> static메서드로 변경 불가 

 

 

2.3 super, super() 

super

  • 조상의 멤버와 자신의 멤버를 구별하는 데 사용 
  • 상속받은 멤버와 자신의 멤버가 이름 같을 때 super를 붙여 구분

 

 

super()

  • 자손 클래스 인스턴스 생성 시 자손과 조상의 멤버 모두 합쳐진 하나의 인스턴스 생성
  • 이때 조상 클래스 멤버 초기화 작업도 수행되어야함
  • Object클래스 제외한 모든 클래스의 생성자에는 첫 줄에 자신의 다른 생성자 or 조상의 생성자 호출 해야함(생략시 컴파일러가 자동적으로 super(); 를 생성자의 첫 줄에 삽입)
  • 조상 클래스 멤버변수는 조상의 생성자로 초기화되도록 함 

 

 

 

 

 


 

3. 제어자(modifier)

 

3.1 제어자란?

  • 클래스, 변수, 메서드 선언부에 사용되어 부가적인 의미 부여 
  • 접근제어자와 그외 제어자로 나뉨 
  • 접근 제어자는 단 하나만 사용 가능 

 

접근제어자

public, protected, (default), private

 

그 외

static, final, abstract, native, trasient ...

 

3.2 static

클래스의, 공통적인 의미를 가짐

 

3.3 final

마지막의, 변경될 수 없는 의미를 가짐

 

 

3.4 abstract

추상의, 미완성의 의미를 가진다 

 

 

3.5 접근 제어자

 

 

public  접근제한 없음
protected 같은 패키지 내에서, 그리고 다른 패키지의 자손클래스에서 접근 가능
default 같은 패키지 내에서만 접근 가능
private 같은 클래스 내에서만 접근 가능

 

 

접근 제어자를 이용한 캡슐화 

외부로부터 데이터를 보호하기 위해서 사용 

외부에는 불필요한, 내부적으로 사용되는 부분을 감추기 위해서 사용

변수는 private으로 선언하고 getter. setter 메서드 활용해 데이터 접근 

 

 

 

 


 

4. 다형성(polymorphism)

 

4.1 다형성이란?

  • 여러가지 형태를 가질 수 있는 능력(하나의 참조변수로 여러 타입의 객체를 참조)
  • 같은 타입의 인스턴스라도 참조변수 타입에 따라 사용할 수 있는 멤버의 개수 달라짐 
  • 참조변수 타입의 멤버변수가 인스턴스의 멤버 개수보다 같거나 적어야함
    • ✅ 조상클래스 타입의 참조변수로 자손클래스의 인스턴스를 참조(참조 가능 멤버 <= 인스턴스 멤버) 
    • ❌ 자손클래스 타입 참조변수로 조상클래스의 인스턴스 참조 불가(참조 가능 멤버 > 인스턴스 멤버) 

 

 

4.2 참조변수의 형변환

Up-casting

자손타입->조상타입

형변환 생략 가능

 

Down-casting

조상타입->자손타입

형변환 생략 불가 

 

  • 참조변수의 형변환은 인스턴스에 아무런 영향을 미치지 않음 
  • 참조변수의 타입에 따라 참조하는 인스턴스의 접근 가능한 멤버 개수가 달라짐
  • 참조변수가 가리키는 인스턴스의 타입이 무엇인지 확인하는 것이 중요(instanceof 사용)

 

 

instanceof연산자

 

참조변수가 참조하고 있는 인스턴스의 실제 타입 확인(형변환 전에 안전하게 확인)

이항연산자이며 피연산자는 참조형 변수와 타입(결과는 true/false)

 

class Animal {}
class Dog extends Animal {}
class Cat extends Animal {}

public class TestInstanceof {
    public static void main(String[] args) {
        Animal a = new Dog();

        System.out.println(a instanceof Dog);     // true
        System.out.println(a instanceof Animal);  // true
        System.out.println(a instanceof Cat);     // false
        System.out.println(a instanceof Object);  // true
    }
}

참조변수 a 타입은 Animal이고 참조하는 인스턴스 타입은 Dog이다.

Dog인스턴스는 Animal클래스와 Object클래스에게 상속 받았으므로 true가 나오며 해당 타입으로 형변환 가능하다

Cat클래스와 Dog클래스는 상속관계가 아니므로 false

 


 

5. 추상클래스(abstract class)

5.1 추상클래스란?

  • 추상메서드를 포함하고 있는 클래스
  • 자체적으로 인스턴스 생성 불가

 

 

5.2 추상메서드

  • 선언부만 있고 구현부가 없는 메서드 
  • 추상클래스를 상속받는 자손클래스에서 추상메서드의 구현부 완성해야함

 

 

 


 

6. 인터페이스(interface)

6.1 인터페이스란

  • 일종의 추상클래스로 추상화 정도가 더 높음
  • 실제 구현된 것 전혀 없는 기본 설계도
  • 추상메서드와 상수만을 멤버로 가질 수 있음
  • 인스턴스 생성 불가하며 클래스 작성에 도움을 줄 목적으로 사용
  • 미리 정해진 규칙에 맞게 구현하도록 표준을 제시하는 데 사용 

 

6.2 인터페이스 작성

'class' 대신 'interface' 사용

멤버는 추상메서드와 상수만 가능 

interface 인터페이스이름 {
    public static final 타입 상수이름 = 값;
    public abstract 메서드이름(매개변수들);
}
  • 모든 멤버변수는 public static final이어야 하며 생략 가능
  • 모든 메서드는 public abstract이어야 하며 생락 가능

(예외적으로 static메서드와 default method는 JDK1.8부터 허용)

 

 

6.3 인터페이스 상속

클래스처럼 상속 가능하되 다중상속이 허용된다

Object클래스와 같은 최고 조상 없음

 

 

6.4 인터페이스 구현 

추상클래스 처럼 자체적으로 인스턴스 생성 불가하므로 추상메서드를 완성해줄 클래스를 작성해야함

구현한다는 의미의 'implements' 사용

 

 

 

 

 

'Java' 카테고리의 다른 글

[Java]객체지향 프로그래밍 I  (0) 2025.04.06
[Java]배열(array)  (0) 2025.03.25
[Java]제어문(조건문, 반복문)  (0) 2025.03.23
[Java]연산자(operator)  (0) 2025.03.23
[Java]변수(variable)  (0) 2025.03.20