본문 바로가기
코드프레소 체험단/Java 프로그래밍

[Java 프로그래밍 초급] 객체지향 고급 (1)

by 의정부핵꿀밤 2022. 1. 20.
728x90

✨ 이 글은 [ 코드프레소 Java 웹 개발 체험단 활동 ] 내용입니다 ✨

💜 코드프레소 이러닝 강의 수강 중 - Java 프로그래밍 초급 💜

😎 아래의 링크를 통해 프리미엄 IT 교육 서비스, 코드프레소를 확인해보세요 😎

https://www.codepresso.kr/

 

프리미엄 IT 교육 서비스 - 코드프레소

 

www.codepresso.kr


상속의 개념(Inheritance)

  • 일반화된 특성이 정의된 클래스 -> 추상적
  • 일반화된 특성을 모두 가지면서, specific한 특성까지 정의한 클래스 -> 구체화
  • 상속을 하는 클래스 -> 부모/상위/기반 클래스
  • 상속을 받는 클래스 -> 자식/하위/파생 클래스
  • 일반화된 클래스(부모 클래스)를 재사용하여 새로운 specific한 클래스(자식 클래스)를 생성하는 것이다
  • 자식 클래스는 부모 클래스의 모든 멤버변수와 메소드를 상속 받는다
  • 상속은 여러 번 가능하기 때문에, 상속을 거듭할수록 자식 클래스의 멤버 변수와 메소드 개수는 같거나 늘어날 수도 있다
  • 상속의 횟수는 제한이 없다 -> 여러 레벨로 상속이 가능하다!
  • 객체 지향 프로그래밍을 구성하는 주요 특징 중 하나이다
  • 클래스 간의 계층적 분류(hierarchical classifications)가 가능해진다
  •  

 

 

 

 

Java 로 상속 구현하기

  • extends를 사용하여 부모 클래스의 멤버를 상속받아 확장시킬 수 있다

상속의 예시

  • 상속받은 멤버는 자식 클래스에서 별도로 선언하지 않는다

User의 멤버를 상속받아서 재정의할 필요가 없다!

 

 

 

상속의 특징

  • 클래스 간의 계층적 분류(hierarchical classification)가 가능해진다
  • 상속받은 멤버는 자식 클래스에서 별도로 선언하지 않는다 -> 자식 클래스를 간결하게 유지 가능!
  • 상속받은 멤버에 대한 코드는 부모 클래스에서 공통적으로 관리할 수 있다

 

 

상속의 장점

  • 코드의 재사용성 증가
  • 공통된 부분은 부모 클래스에 놓고, specific한 부분만 자식클래스에 추가하면 되기 떄문에 재사용성이 증가한다
  • 클래스 간의 계층 구조에 따른 다형성(polymorphism)을 적용할 수 있다

 

 

 

단일 상속

  • JAVA는 다중 상속을 허용하지 않는다 (다중 상속을 허용하는 언어도 존재함!)
  • 즉, 하나의 클래스로부터만 상속을 받을 수 있다 -> 단일 상속만 허용 
  • 2개 이상의 클래스로부터 상속을 시도하면 에러 발생!

접근 제어자(access modifier)

  • 외부로부터의 접근을 제한하기 위한 목적의 키워드
  • 상속 관계에서의 접근을 제한하기 위해서도 사용된다

 

 

private 접근 제어자

  • 외부로부터의 접근을 제한하기 위한 키워드
  • 오직 같은 클래스 내에서만 접근이 가능하다
  • 상속 받은 자식 클래스에서도 접근이 제한된다
  • private 멤버 변수에 대해 외부 접근이 필요한 경우, 부모 클래스에 public getter, setter 메소드를 제공한다
    •  

 

 

 

protected 접근 제어자

  • 외부로부터의 접근을 제한하기 위한 키워드
  • 상속 받은 자식 클래스에서의 접근을 가능하게 한다

 

 

상속 관계의 접근 제어

  • 자식 클래스에서의 접근을 제한하기 위해서는 private 을 사용한다
  • 자식 클래스에서의 접근을 허용하기 위해서는 protected 를 사용한다
  • 멤버 변수의 특성에 맞는 접근 제어자를 선택하는 것이 중요하다!

 


 

상속 관계에서 생성자는 어떻게 동작할까요?

  • 부모 클래스의 생성자는 상속되지 않는다
  • 자식 클래스의 객체를 생성 시, 부모 클래스의 기본 생성자를 자동으로 호출한다
  • 최상위 부모 클래스의 생성자부터 한 단계 아래 자식으로 차례대로 호출한다

 

 

 

super 키워드

  • Java에서 super 는 부모 클래스를 의미하는 키워드
  • super( ); => 부모 클래스의 파라미터 없는 생성자를 호출한다
  • 자식 클래스에서 부모 클래스 생성자를 명시적으로 호출하지 않으면, Java 컴파일러는 자식 클래스 생성자의 첫번째 라인에 super( ); 를 자동으로 삽입한다
  • 굳이 super()를 쓰지 않아도 자바 컴파일러가 알아서 호출하는거임!

  • 파라미터가 있는 부모 생성자는 Java 컴파일러가 자동으로 호출하지 않는다
  • 파라미터가 있는 생성자를 호출할 때는 반드시 명시적인 선언이 필요하다
    • 파라미터가 있는 부모 클래스의 생성자 호출 예시
  • 부모 클래스의 멤버 변수 또는 메소드 접근 시 super를 사용한다

  • 자식 객체에서 부모 객체의 멤버 변수 또는 메소드 접근 시 super 사용

 

 

 

상속 관계의 생성자 정리!

  • 상속 시 생성자는 상속되지 않는다
  • super()는 파라미터가 없는 부모 클래스 생성자를 호출한다
  • 자식 객체 생성자에서 명시적으로 부모 클래스 생성자를 호출하지 않는 경우 super()를 자동으로 호출한다
  • 파라미터가 있는 부모 객체 생성자는 명시적으로 호출해야 한다
  • super부모 클래스를 지칭한다 (this는 자기 자신을 지칭)
  • super.oo 으로 부모 클래스의 멤버 변수 또는 메소드에 접근이 가능하다

 


 

메소드 오버라이딩(method overriding)

  • 부모 클래스로부터 상속받은 메소드를 자식 클래스가 자신만의 특성에 맞게 새롭게 구현하는 것
  • 이름도 파라미터도 같지만, 다른 동작을 수행하는 것
  • 오버라이딩을 통해 코드의 간결성을 유지하면서 내용을 확장시킬 수 있다!

 

 

 

메소드 오버라이딩의 조건

  • 오버라이딩하는 부모 클래스의 메소드와 이름이 같아야 한다
  • 오버라이딩하는 부모 클래스의 메소드와 파라미터가 같아야 한다
  • 오버라이딩하는 부모 클래스의 메소드와 리턴 타입이 같아야 한다

 

 

다형성 실습

  • 다형성 : 다양한 형태를 가질 수 있는 성질
  • 자바에서는 특정 타입의 참조 변수가 때에 따라서 여러 객체를 참조할 수 있다!
  • 부모 객체가 자식 객체 타입을 참조할 수 있으므로 다형성의 장점을 살릴 수 있다
    • 예를 들어 부모 객체를 파라미터로 받는 메소드를 작성한다고 해보자
    • 자식 객체에는 부모 객체의 메소드를 자신의 특성에 맞춰 오버라이딩한다
    • 그리고 한 메소드에서 오버라이딩한 메소드를 호출한다고 하자!
    • 그럼 부모 객체를 파라미터로 받아서 메소드를 호출하기 때문에 굳이 코드를 여러 번 작성하지 않아도 각각의 특성에 맞는 오버라이딩한 메소드가 출력된다!
    •  
public void processLogin(User user) {
	System.out.println("process something before login");
	user.login();
	user.enterPage();
	System.out.println("process somethig after login");
}

만약 요런식으로 작성했다고 해보자

여기서 User 객체가 부모 객체고, 해당 메소드 호출은 다음과 같이 한다

 

 

그럼 결과는 아래와 같다!

동일한 메소드를 호출해도 각각 다른 동작을 수행할 수 있게 되는 것이다!

728x90

댓글