초코딩(chocoding)

[Java] 자바의 정석 / 상속에 대하여 (개념정리) 본문

[Java] 자바의 정석

[Java] 자바의 정석 / 상속에 대하여 (개념정리)

sweetychocoding 2023. 9. 7. 01:24
728x90
public class Main {

	public static void main(String[] args) {
		/*
		 ** 상속 ======================================================================================
		 => 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것
		 
		 - 적은 양의 코드로 새로운 클래스를 작성할 수 있음
		 - 코드를 공통적으로 관리하기 때문에 코드의 추가 및 변경이 매우 용이함
		   => 코드의 재사용성을 높이고 코드의 중복을 제거하여
		            프로그램의 생산성과 유지보수에 크게 기여
		            
		 - 상속의 구현 방법
		   => 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 "extends"와 함께 써 주면 됨
		   => class Parent { }
		      class Child extends Parent {
		      		//...
		      		//...
		      }
		      
		   => 두 클래스는 서로 상속 관계에 있음
		   => 상속해주는 클래스 : 조상 클래스
		           상속 받는 클래스: 자손 클래스
		           
		  - 자손 클래스는 조상 클래스의 모든 멤버를 상속 받음 (단, 생성자와 초기화 블럭은 상속되지 않음)
		    => 항상 조상 클래스보다 같거나 많은 멤버를 갖고 상속의 상속을 거듭할수록 상속받는 클래스의 멤버 개수는 점점 늘어남
		    => 상속 받는다라는 의미가 조상 클래스를 확장 (extend)한다는 의미로 해석될 수 있음 (상속의 키워드가 extends인 이유)
		    
		    
		    
		 ** 클래스 간의 관계 - 포함관계 ====================================================================
		 => 한 클래스의 멤버변수로 다른 클래스 타입의 참조변수를 선언하는 것
		 => 클래스 간에 "포함(composite)관계"를 맺어주어 클래스를 재사용할 수 있게 함
		 
		 - 하나의 거대한 클래스를 작성하는 것보다 단위별로 여러 개의 클래스를 작성한 다음,
		      이 단위 클래스들을 포함관계로 재사용하면 보다 간결하고 손쉽게 클래스를 작성할 수 있음
		      또한, 작성된 단위 클래스들은 다른 클래스를 작성하는데 재사용될 수 있음   
		 
		 
		 
		 ** 클래스 간의 관계 결정하기 ======================================================================
		 - 상속관계 : '~은 ~이다.' (is-a)
		 - 포함관계 : '~은 ~을 가지고 있다.' (has-a)
		 
		 => 클래스를 가지고 문장을 만들었을 때, 두개의 관계문 중에 문장이 더욱 성립되는 경우에 관계를 맺어 주면 됨
		 
		 
		 
		 ** 단일 상속 ==================================================================================
		 => 자바에서는 단일 상속만을 허용함
		    : 다중상속 허용시, 복합적인 기능을 가진 클래스를 쉽게 작성할 수 있다는 장점이 있지만
		           클래스간의 관계가 매우 복잡해지고
		           다른 클래스로부터 상속받은 멤버간의 이름이 같은 경우,
		           구별할 수 있는 방법이 없다는 단점이 있기 때문에
		           자바는 이러한 다중상속의 문제점을 해결하기 위해
		           다중 상속의 장점을 포기하고 "단일 상속만을 허용"
		  
		 => 하나의 조상 클래스만을 가질 수 있기 때문에 클래스 간의 관계가 보다 명확해지고 코드를 더욱 신뢰할 수 있게 해줌
		 
		 
		 
		 ** 모든 클래스의 조상 - Object클래스 ===============================================================
		 => 모든 상속계층도의 최상위에는 Object클래스가 위치함
		 => 자바의 모든 클래스들은 Object클래스의 멤버들을 상속 받기 때문에
		    Object클래스에 정의된 멤버들을 사용할 수 있음
		 
		 
		 
		 ** 오버라이딩 ==================================================================================
		 => 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것
		 
		 - 오버라이딩의 조건
		 => 메서드의 내용만을 새로 작성하는 것이므로 메서드의 선언부(메서드 이름, 매개변수, 반환타입)는 조상의 것과 완전히 일치해야 함
		        단, 접근 제어자(access modifier), 예외(Exception)는 제한된 조건 하에서만 다르게 변경 가능
		 
		 	1. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.
		 	2. 조상 클래스의 메서드보다 많은 수의 예외를 선언할 수 없다.
		 	
		 	
		 
		 => 오버로딩 vs 오버라이딩
		  - 오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것 (new)
		  - 오버라이딩 : 상속받은 메서드의 내용을 변경하는 것 (modify, change)
		 
		 
		 
		 ** 참조변수 super ==============================================================================
		 => 자손 클래스에서 조상 클래스로부터 상속받은 멤버를 참조하는데 사용되는 참조변수
		 => 상속받은 멤버와 자신의 멤버와 이름이 같을 때 super을 붙여 구별할 수 있음
		 => 모든 인스턴스 메서드에서 this와 super가 지역변수로 존재하고
		    this와 super에는 자신이 속한 인스턴스의 주소가 자동으로 저장됨
		    
		    
		 ** 조상의 생성자 super() =========================================================================
		 => 조상의 생성자를 호출하는데 사용
		 
		 */
		
	}

}
728x90