자바/자바 입문 공부일지

자바 기초 공부 일지 23. 클래스 상속과 생성자

Tomitom 2022. 10. 31. 09:49
반응형

 

 

● 상속은 가지고 있는 것을 물려주는 것입니다. 

자바에서 상속은 클래스가 가지고 있는 데이터와 기능을 주는 문법입니다. 

이것은 클래스 안에 있는 코드의 재활용이라기 보다는 

연관된 일련의 클래스들에 대해서 공통적인 규약을 정의한다는 것입니다. 

 

상속의 대상이 되는 클래스 = 상위 클래스, 기초 클래스, 부모 클래스, 슈퍼 클래스  

상속을 하는 클래스 = 하위 클래스,  유도 클래스, 자식 클래스, 서브 클래스

 

class Man {

   String name;

   public void tellYourName() {

      System.out.println("My name is " + name);

   }

}

 

 Man 클래스를 만들었습니다. 

tellYourName() 이라는 메소드 멤버가 있습니다. 

 

class BusinessMan extends Man {

   String company;

   String position;

   public void tellYourInfo() {

      System.out.println("My company is " + company);

      System.out.println("My position is " + position);

      tellYourName();

   }

}

 

그리고 BusinessMan 이라는 클래스를 만들어서 extens 로 Man 클래스를 확장시켜 상속 받고, 그 아래로 다른 멤버들을 추가시켰습니다. 

이 경우 상위 클래스는 Man 클래스 이고, 하위 클래스는 BusinessMan 클래스 입니다. 

 

파이썬의 경우 다중상속이 가능했지만, 자바 클래스의 상속은 다중상속이 불가능합니다.

그렇기 때문에 한 클래스에서 상속받을 수 있는 클래스의 수는 최대 한 개입니다. 

 

하단의 예제로 상속의 기본 코드를 확인해볼게요. 

 

package day15;




class Woman{
	String name; 
	void showName() {

		System.out.println("내 이름은 " + name);
		
	}
}

	class BusinessWoman extends Woman{
		String company;
		void showCompany() {
			System.out.println("일하는 곳은 " + company);
			}
	}


public class Test05 {

	public static void main(String[] args) {

		BusinessWoman bw = new BusinessWoman();
		bw.name = "이슬이";
		bw.company = "물체육관";
		bw.showName();
		bw.showCompany();
		
	}
}

 

 

● 인스턴스를 생성하기 위해서는 반드시 생성자를 호출해야 합니다. 

하지만 생성자는 상속이 되지 않기 때문에 대신 하위 클래스로 인스턴스를 생성할 때 

상위 클래스의 기본 생성자를 자동으로 호출하게 됩니다. 

 

그것에 대한 예제를 하단에서 확인할게요. 

 

package day15;

    class SuperClass {
        public SuperClass() { // 상위 생성자
            System.out.println("상위 생성자 호출");
        }
    }
 
 
 
첫 번째 클래스를 생성합니다. SuperClass 생성자에 인수를 넣지 않았습니다. 
 
 

    class SubClass extends SuperClass{
        public SubClass() { // 하위 생성자
            System.out.println("하위 생성자 호출");
        }
    }
 
첫 번째 클래스의 상속을 받은 두 번째 클래스를 생성합니다. 마찬가지로 SubClass 생성자에 인수를 넣지 않았습니다. 

 

    public class Test04 {
        public static void main(String[] args) {
            SubClass sc = new SubClass(); // 하위 인스턴스 생성
        }
    }
 
그 다음에 상속을 받은 두 번째 클래스로 인스턴스를 생성할 때, 상위 클래스의 기본 생성자를 자동으로 호출하게 됩니다.
  

 

 

지금은 인수를 받지 않은 클래스였지만, 아래부터는 인수를 받는 클래스를 작성해볼게요. 

 

package day15;

	class SuperClass {
		public SuperClass(String str) { // 첫번째 생성자
			System.out.println(str + "호출");
		}
	}

	class SubClass extends SuperClass{
		public SubClass() { // 두번째 생성자
			super("첫번째 생성자 "); // 첫번째 생성자 호출
			System.out.println("두번째 생성자 호출");
		}
	}

	public class Test04 {
		public static void main(String[] args) {
			SubClass sc = new SubClass(); // 하위 인스턴스 생성
		}
	}

 

두 번째 생성자에서 super 키워드를 통해 상위 클래스의 생성자 호출을 명시할 수 있습니다. 

자식 클래스는 부모 클래스의 생성자를 호출하거나 참조할 수 없지만 

super () 키워드가 포함될 경우 상위 클래스를 호출을 지정하는 것이 되어 

부모 클래스까지 접근하여 생성할 수 있습니다. 

하단의 예제로 다시금 살펴볼게요. super 키워드는 중첩해서 사용할 수 있습니다. 

 

package day15;

class SuperCLS {            // SuperCLS 첫 번째 클래스를 만듭니다. 
    public SuperCLS() {
        System.out.println("첫 번째 클래스()");
    }

    public SuperCLS(int i) {
        System.out.println("첫 번째 클래스(int i)");
    }

    public SuperCLS(int i, int j) {
        System.out.println("첫 번째 클래스(int i, int j)");
    }
}

class SubCLS extends SuperCLS {
    public SubCLS() {
        System.out.println("두 번째 상속 클래스()");
    }

    public SubCLS(int i) {
        super(i);
        System.out.println("두 번째 상속 클래스(int i)");
    }

    public SubCLS(int i, int j) {
        super(i, j);
        System.out.println("두 번째 상속 클래스(int i, int j)");
    }
}

public class Test04 {

	
	public static void main(String[] args) {
		  System.out.println("1. ");
	        new SubCLS();

	        System.out.println("2. ");
	        new SubCLS(1);

	        System.out.println("3. ");
	        new SubCLS(1, 2);
	    }
	}

 

 
 
반응형