ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java_Basic]클래스의 상속1 : 상속의 기본(윤성우의 열혈 Java 프로그래밍)
    Java/Basic 2021. 1. 2. 13:49

    상속

    연관된 일련의 클래스들에 대해 공통적인 규약을 정의할 수 있다

    (단순히 재활용의 목적으로 상족이 쓰일 경우 무의미한 코드가 될 수 있다)

     

     

    상속의 특성

    부모 클래스

    class Man{
    	String name;
        public void tellYourName(){
        	System.out.println("My name is " + name);
        }
    }
    

    자식클래스

    class BusinessMan extends Man{	//Man 클래스를 상속하는 클래스
    	String company;
        String position;
        public void tellYourInfo(){
        	System.out.println("My company is" + company);
            System.out.println("My position is " + position);
            tellYourName();		//Man 클래스를 상속했기 때문에 호출 가능
        }
    }
        

    BusinessMan man = new BusinessMan(); 

    해당 참조변수 man이 사용 가능한 인스턴스들

    String name;

    String company;

    String position;

    void tellYourName(){...}

    void tellYourInfo(){...}

     

    상속과 생성자

    class Man{
    	String name;
    	public void tellYourName(){
    		System.out.println("My name is " + name);
    	}
    }
    
    class BusinessMan extends Man{
    	String company;
    	String position;
    
    	public BusinessMan(String name, String company, String position){
    		//상위클래스 Man의 멤버 초기화
    		this.name = name;
    
    		//클래스 BusinessMan 의 멤버 초기화
    		this.company = company;
    		this.position = position;
    	}
    	public void tellYourInfo(){
    		System.out.println("My company is " + company);
    		System.out.println("My position is " + position);
    		tellYourName();
    	}
    }
    
    class MyBusinessMan{
    	public static void main(String[] args){
    		BusinessMan man  = new BusinessMan("YOON", "SAMSUNG", "CEO");
    		man.tellYourInfo();
    	}
    }

    이렇게 부모 클래스의 변수도 자식 클래스에서 초기화해주면 에러는 발생하지 않지만 이건 좋은 방법이 아니다.

    모든 멤버는 그 멤버가 생성된 클래스 안에서 초기화 하는것이 좋다.

     

    class SuperCLS{
    	public SuperCLS(){		//생성자
    		System.out.println("I'm Super Class");
    	}
    }
    
    class SubCLS extends SuperCLS{
    	public SubCLS(){		//생성자
    		System.out.println("I'm Sub Class");
    	}
    }
    
    class SuperSubCon{
    	public static void main(String[] args){
    		new SubCLS();
    	}
    }
    

    해당 결과를 보니 하위 클래스의 인스턴스 생성 시 상위 클래스, 하위클래스의 생성자가 모두 호출됨을 알 수 있다. 

    또한 하위클래스의 인스턴스 생성시 상위 클래스의 생성자가 먼저 호출이 된다. 

    이로써 하위 클래스에서 상위 클래스의 생성자를 명시적으로 호출하지 않으면 인자를 받지 않은 생성자가 자동으로 생성됨을 알 수 있다.

    상위 클래스의 생성자를 명시적으로 호출하기 위해 키워드 super를 사용한다.

    키워드 super

    class SuperCLS{
    	public SuperCLS(){
    		System.out.println("Con : SuperCLS()");
    	}
    	public SuperCLS(int i){
    		System.out.println("Con : SuperCLS(int i)");
    	}
    	public SuperCLS(int i, int j){
    		System.out.println("Con : SuperCLS(int i, int j)");
    	}
    }
    
    class SubCLS extends SuperCLS{
    	public SubCLS(){
    		System.out.println("Con : SubCLS()");
    	}
    	public SubCLS(int i){
    		super(i);		//상위 클래스의 생성자를 지정 및 호출
    		System.out.println("Con : SubCLS(int i)");
    	}
    	public SubCLS(int i, int j){
    		super(i, j);	//상위 클래스의 생성자 지정 및 호출
    		System.out.println("Con : SubCLS(int i, int j)");
    	}
    }
    
    class SuperSubCon2{
    	public static void main(String[] args){
    		System.out.println("1. ");
    		new SubCLS();
    		System.out.println();
    	
    		System.out.println("2. ");
    		new SubCLS(1);
    		System.out.println();
    
    		System.out.println("3. ");
    		new SubCLS(1,2);
    		System.out.println();
    	}
    }

    class Man{
    	String name;
    
    	public Man(String name){
    		this.name = name;
    	}
    	public void tellYourName(){
    		System.out.println("My name is " + name);	
    	}
    }
    
    class BusinessMan extends Man{
    	String company;
    	String position;
    
    	public BusinessMan(String name, String company, String position){
    		super(name);
    		this.company = company;
    		this.position = position;
    	}
    	public void tellYourInfo(){
    		System.out.println("My company is " + company);
    		System.out.println("My position is " + position);
    		tellYourName();
    	}
    }
    
    class MyBusinessMan2{
    	public static void main(String[] args){
    		BusinessMan man = new BusinessMan("YOON", "SAMSUNG","CEO");
    		man.tellYourInfo();
    	}
    }

    static 상속

    static 선언이 붙는 클래스 변수와 클래스 메소드는 상속의 대상이 아니다.

    직접 접근하는 권한은 자식도 갖게 된다.

    class SuperCLS{
    	static int count = 0;
        public SuperCLS(){
        	count++
        }
    }
    class SubSLC extends SuperCLS{
    	public void showCount(){
        		System.out.println(count);
        }
    }
                

     

    protected 는 하위 클래스 접근을 허용한다.

    private 되면 접근 불가이다.

    class SuperCLS{
    	protected static int count = 0;
    
    	public SuperCLS(){
    		count++;
    	}
    }
    
    class SubCLS extends SuperCLS{
    	public void showCount(){
    		//상위 클래시에 위치한 클래스 변수 count 에 접근
    		System.out.println(count);
    	}
    }
    
    class SuperSubStatic{
    	public static void main(String[] args){
    		SuperCLS obj1 = new SuperCLS();	//count 값 1 증가
    		SuperCLS obj2 = new SuperCLS(); 	//count 값 1 증가
    
    		// 아래 인스턴스 생성 과정에서 SuperCLS 생성자 호출 되므로,
    		SubCLS obj3 = new SubCLS();	//count 값 1 증가
    		obj3.showCount();
    	}
    }

    댓글

Designed by Tistory.