관리 메뉴

사적공간

생성자, 소멸자/ 오버로딩(Overloading) / 오버라이딩(Overriding) 본문

KNOU_CS/JAVA

생성자, 소멸자/ 오버로딩(Overloading) / 오버라이딩(Overriding)

2sac 2024. 3. 22. 20:59

생성자,  소멸자

public class Main { 
    public Main(){
        System.out.println("매개변수 없는 생성자 호출"); 
    }
    public Main(int a){
         System.out.println("파라미터가 있는 생성자 호출: "+a); 
    }
    public void finaliz(){
         System.out.println("소멸자 호출"); 
    } 
    
    public void fn(){
         System.out.println("fn() 매서드 실행 "); 
    }
    
    public static void main(String[]args){
        Main s1 = new Main();
        Main s2 = new Main(5); 
        s1.fn();
        s1.finaliz();
    }
}

매개변수 없는 생성자 호출
파라미터가 있는 생성자 호출: 5
fn() 매서드 실행 
소멸자 호출

 


 

 

생성자 호출: 클래스명 = new 클래스명(매개변수); 

생성자는 해당 클래스 객체가 생성될 때 자동으로 호출되는 특수한 종류의 메서드이다. 

생성자는 일반적으로 클래스의 멤버 변수를 초기화하거나 클래스를 사용하는 데 필요한 설정이 사용함

생성자는 클래스 명과 동일한 메서드명을 가지고, 반환 값이 없다.

생성자는 오버라이딩이 안됨. 

vs

소멸자 호출: 클래스변수.finalize(매개변수)

finalize 메서드는 객체의 수명이 끝났을 때 객체를 제거하기 위한 목적으로 사용 되는 메서드이다. 

반환 값이 없다. 

 

 

자바는 자식 클래스를 생성하면 부모 클래스 생성자를 먼저 방문하고, 그 다음에 자식 클래스 생성자를 방문함. 

vs

파이썬은 자식 클래스를 생성하면 자식 클래스의 생성자만 방문함

 

 

 

 

 


 

클래스 상속

class A{ 
    public void fnA(){
        System.out.println("A");
    }
}
class B extends A{ 
    public void fnB(){
        System.out.println("B");
    }
}

public class Main {
    public static void main(String[] args){
        B b = new B(); // B 클래스의 객체 b 를 생성 
        b.fnA(); // 객체 b의 메서드 fnA()를 호출했지만 없어서 상속해준 A클래스의 fnA() 호출
        b.fnB(); // 객체 b의 메서드 fnB()를 호출  
    }
}

A
B

 

 

오버로딩  

오버로딩은 부모 자식메서드 이름이 같고, 매개변수 데이터 타입이나 개수가 달라야 함. 

/*아래의 메서드 모두 fn()으로 메서드 이름이 같고
매개변수 데이터 타입이 다르거나 개수가 달라야 함. 
반환형은 같거나 달라도 상관없음. */

class A {
public void fn(){ 
    System.out.println("A"); 
}

public void fn(int i){ 
    System.out.println(i);
}

public void fn(double d){
    System.out.println(d);
}

public int fn(int a, int b){
    return a+b;
 }
}

public class Main{
    public static void main(String args[]){
        A a = new A(); // 변수 a 생성, 생성자가 생성되어야 하지만 생성자가없으므로 아무일도 안 일어남 
        a.fn(); // 파리미터가 없는 fn() 메서드 호출 
        a.fn(7); // 파라미터가 정수인 메서드 호출 
        a.fn(10.0); // 파라미터가 실수인 메서드 호출 
        System.out.println(a.fn(2, 3)); // 파라미터가 정수 두개인 메서드 호출 
    }
}

A
7
10.0
5

 

 

 

오버라이딩 

생성자는 클래스명과 동일한 메서드이고,

 vs

오버라이딩은 부모, 자식 간 동일한 이름의 메서드임. 

class A{
    public A(){ // 클래스명과 동일한 메서드 생성자 
       System.out.println("A 생성자이다.");
    }
    
    public void fn(){ 
        System.out.println("A");
    }
}

class B extends A{
      public B(){ // 클래스명과 동일한 메서드 생성자 
       System.out.println("B 생성자이다.");
    }
    
    public void fn(){ // 부모 클래스 A의 fn()와 동일한 이름의 동일한 자식 클래스 B의 메서드fn()
        System.out.println("B");
    }
}

public  class Main{
    public static void main(String args[]){ 
        A a = new B(); // B 클래스를 a변수로 생성,B클래스를 a변수에 생성하므로 B의 생성자 B()와 A생성자 A()를 호출함. 
        a.fn();
    }
}

A 생성자이다.
B 생성자이다.
B

 

오버라이딩은 하위 클래스에서 상위 클래스 메서드를 재정의하는 기능 

오버라이드 하고자 하는 메서드가 상위 클래스에 존재해야 함. 

메서드 이름, 메서드 매개변수 개수, 데이터 타입이 같아야 함. 

메서드 반환형이 같아야 함. 

class 부모 클래스명{

public 반환자료형 메서드명(자료형 변수명){  }

}

class 자식클래스명 extends 부모클래스명{

public 반환자료형 메서드명(자료형 변수명){

// 부모 클래스의 반환형, 메서드명, 매개분수가 동일해야 . 

 }

}

 

 

자바 생성자와 오버라이딩 

class Parent{
    public Parent(){
        System.out.println("A");
    }

    public void fn(){
        System.out.println("B");
    }
}

class Child extends Parent { 
    public Child(){
        System.out.println("C");
    }
    
    public void fn(){
        System.out.println("D"); 
    } 
} 

public class Main{
 public static void main(String args[]){
     Child c = new Child(); //자식 클래스 Child에서 생성하므로, 자바규칙에 따라 부모클래스의 생성자 -> 자식 클래스 생성자 호출 
     c.fn(); // Child 클래스의 메서드 fn() 호출 
 }
}

A
C
D

 

 

자바 상위 클래스 접근( 키워드 super)

class A{
    public void fn(){
        System.out.println("A"); // B 클래스의 super키워드로 호출된 부모클래스 A의 fn()
    }
}
   
class B extends A{ 
    public void fn(){
        super.fn(); // super 키워드를 이용해 상위 클래스의 메서드(변수)를 접근함. 
        System.out.println("B"); // 차례로 실행됨. 
    }
} 

public class Main{
 public static void main(String args[]){
     A a = new B(); // 생성자는 없으니 실행 안되고, B클래스로 만든 객체 a 
     a.fn(); // B클래스의 객체 a 호출함. 
      }
}

A
B

'KNOU_CS > JAVA' 카테고리의 다른 글

상속과 생성자/super( )  (0) 2024.04.16
this( )  (0) 2024.04.16
인터페이스 구문 / 컬렉션 / 예외처리  (0) 2024.03.26
메서드 / 클래스  (0) 2024.03.21
배열/ 입출력/ 연산자 /반복문  (0) 2024.03.21