JAVA

[JAVA] super() / final / 포함관계 (Has a) / 클래스를 멤버변수로 넣기 / classpath

sian han 2022. 3. 1. 01:10

 

15일차에서 조금 정리했지만 16일차에서 본격적으로 정리하는

※super() - 부모 클래스의 생성자를 호출하는 super()

★★★★★

부모 생성자 매개변수를 가지고 있다면 자식은 부모의 생성자에게 매개변수를 넣어줘야 함

 - 자식클래스에서 부모클래스 매개변수를 받아오기위해 사용.

 - 모든 클래스의 생성자 첫 줄에는 생성자를 호출해야한다

   - 그렇지 않으면 컴파일러가 자동적으로 super() 를 생성자의 첫줄에 넣어준다

 

Point(int x, int y){
		
		this.x=x;
		this.y=y;
	}

△ 매개변수와  this 사이에 컴파일러에 의해 자동생성된 super()가 생략 되어있다

super(); => 컴파일러가 자동적으로 삽입. 조상인 object 클래스의 생성자( Object() )를 호출

 

 

 

▷ 차이점알기

this () : 같은 클래스의 다른 생성자를 호출하는 데 사용

super () : 부모 클래스의 생성자를 호출하는데 사용됨

 

 

 

 

 자식클래스에서 super () 사용순서

 

1. 부모생성자 매개변수 받아오기

Student(String name, int age)

2. 자식(본인)클래스에서 추가된 매개변수를 생성자에 추가하기

Student(String name, int age, String major)

3. super , this 이용해 부모 매개변수 받아오고,

   본인 매개변수 넣어주기

 Student(String name, int age, String major){
		super(name,age);
		this.major=major;

▽완성본 한눈에 보기

class Person{
	protected String name;
	protected int age;
	
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
}

class Student extends Person{
	private String major;
	Student(String name, int age, String major){
		super(name,age);
		this.major=major;
	}

 

 

 

 

 

Also

▷자식 클래스에 매개변수가 없더라도 부모클래스의 매개변수를 받는 생성자를 만들어줘야한다

=> 자식 클래스에 매개변수가 없더라도 반드시 생성자를 만들어줘야함

class Father{
	protected String name;
	
	Father(String name){
		this.name = name;
	}
   }
    
    
 class Son extends Father{
	Son(String name){
		super(name);
	}
}

   => 자식클래스인 son 에는 매개변수가 없지만 부모클래스인 Father 의 매개변수 name을 받기위해

        super 를 이용하여 생성자를 만들어 줌

 

 

 

 

 

만약 ! ▽ 아래처럼

자식클래스 생성자에서 super로 부모의 매개변수를 받아오지 않는다면 ?

                                              ( like 상속관계가 아닌 클래스의 생성자를 만들듯이)

class Father{
	protected String name;
	
	Father(String name){
		this.name = name;
	}
   }
    
    
 class Son extends Father{
	private int age;
    
    Son(int age);
    this.age = age;
    
	}
}

error ) Implicit super constructor Point() is undefined. Must explicitly invoke another constructor

 

자식클래스 생성자 수정 : 

Son (String name, int age){

this.age = age;

super(name);

}

==> Good ~

 

 


 

※final

 - 마지막의, 변경될 수 없는

 - final 을 사용하면 제한이 생긴다 ( ~할 수 없다 )

 - 클래스, 메서드, 멤버변수, 지역변수 에서 사용할 수 있다

 

[1] final 변수 : 

  - 값을 변경할 수 없는 상수

                       ㄴ 상수 : 한번 초기화되면 더 이상 값을 변경할 수 없는 멤버

  - 멤버변수, 지역변수에 모두 사용가능

  - The final field MyFinal.PI cannot be assigned

 

  1-1 ) fianl 변수 :

     - 각 인스턴스마다 다른값을 갖도록 할 수 있다

     - 상수지만 선언과 함께 초기화하지않고 생성자에서 단 한번만 초기화 가능

final String KIND;
final int NUMBER;

	Card(String k, int num){
		KIND = k;
		NUMBER =num;
	}

  

  1-2 ) static final 변수 :

     - 클래스 차원에서 하나만 생성되고, 모든 인스턴스가 같은 값을 갖는다 (공유)

     - 선언과 함께 초기화

static final int WIDTH = 100;

 

 

[2] final 메서드 :

  - 오버라이딩을 할 수 없게 됨

  - error : Cannot override the final method from Parent2

 

[3] final 클래스 : 

  - 자식클래스를 정의하지 못하게 됨

  - error : The type Child cannot subclass the final class Parent

 


 

 

※포함관계 (Has a)

 

 - 상속관계 (Is a) 와 유사하니 주의.

▶그렇다면 포함관계상속관계는 각각 언제 사용하나요 ? 

 

상속관계 : is a 관계가 성립하면 상속을 이용한다

~ is a => ~ 는 일종의 ~ 이다

ex ) SportsCar is a Car

 

포함관계 : has a 관계가 성립하면 포함관계를 이용한다

~ has a = > ~는 ~를 가지고 있다

ex ) Circle has a Point

 

 

▶ 포함관계 사용해보기

 

 

1. 포함시킬 class 생성

class Points2{
	int x;
	int y;
	
	Points2(int x,int y){
		this.x = x;
		this.y = y;
	}
}

 - 포함관계 멤버변수 제한자 protected 일 필요 없음

 

2. 재사용하려는 클래스를 멤버변수로 포함시킨다

class Circle2{
	private Points2 p; // 위의 class 를 매개변수로 가져옴
	private int r;

 

3. 재사용하려는 클래스를 생성자 매개변수에 넣는다

class point {
int x;
}

class Circle{
	private Points p;
  
    Circle(int r, Points p){
    this.p=p;
    }
  }

 - 클래스를 매개변수로 넣는 것 어려울것 없음 ~!

   모르겠으면

   1. int 로 우선 써보고

   2. int 를 클래스명으로 변경한다

 

 

4. 사용할때는 참조변수 . 으로 사용

//재사용할 class
class point {
int x;
}

// 새 class
class Circle{
	private Points p;
    
    Circle(int r, Points p){ // (클래스명 + 참조변수) 로 클래스를 매개변수에 넣기
    this.p=p;
    }
    
    public void showInfo() {
    System.out.println("x="+ p.x); //참조변수 . 
    }

 

5-1. main 에서 

   클래스를 매개변수로 객체생성

   직접넣기

Circle c = new Circle(new Points(10,20));
c.printInfo();

 

5-2. main 에서

      클래스를 매개변수로 객체생성

      변수지정해서 넣기

int n =7;
Points p = new Points(30,40);
Circle c1 = new Circle(n,p);
c2.printInfo();

 


 

※ classpath

와이거진짜모르겠는데 일단 필기함

 

 환경변수 path : 확장자가 exe 인 실행화일을 찾는경로
 환경변수 classpath : 확장자가 class 인 클래스화일을 찾는 경로
 
 자바 가상머신이 클래스를 찾을 때, 이 클래스 패스를(class path) 기준으로 찾게 됨