ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 생성자 -오버로딩(Overloading)과 this() + 오버라이딩(Overriding)
    JAVA/개념 - 김영한 강의 2024. 8. 25. 07:12

     

    생성자

     

    • 객체 생성 직후 객체를 초기화하기 위한 특별한 메서드
    • 반복적으로 초기화하지 않고 처음에 초기화해놔서 나중에 쓰기 편함
    • 생성자를 사용하면 필수값 입력을 보장받아 오류가 생기지 않는다.
    • 이름이 클래스 이름과 같아야 한다. 따라서 첫 글자도 대문자다.
    • 반환타입이 없다.
    • 매개면수가 없는 생성자를 기본 생성자라고 한다.
    • 클래스에 생성자가 하나도 없으면 자바는 매개변수가 없고 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다. 그러나 생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않는다. 

     

     

    생성자 -오버로딩(Overloading)

     

    생성자도 메서드 오버로딩처럼 매개변수만 다르게 해서 여러 생성자를 만들 수 있다. 

     

    public class MemberConstruct {
    
    	String name;
        	int age;
      	int grade;
        
    
        MemberConstruct(String name, int age) { 
        	this.name = name;
            this.age = age;
            this.grade = 50;
        }
        
       
        MmeberConstruct(String name, int age, int grade) {  
        	System.out.println("생성자 호출 name=" + name + ",age=" + age + ",grade=" + grade);
            this.name = name;
            this.age = age;
            this.grade = grade;
        }
    }

     

     

    그런데, 중복되는 부분이 있다.

     

    this.name = name;

    this.age = age;

     

    이걸 this()로 사용해서 중복을 제거할 수 있다. this() 는 생성자 내부에서 자신의 생성자를 호출하기 때문이다.

    (this 는 인스턴스 자신의 참조값을 가리킨다)

     

     

      MemberConstruct(String name, int age) { 
        	this.name = name;
            this.age = age;
            this.grade = 50;
        }
        
        
        // 변경
        
      MemberConstruct(String name, int age) { 
        	this(name, age, 50); 
        }

     

     

    • 기존 MemberConstruct 에 생성자를 하나 추가해서 생성자가 2개가 되었다. 새로 추가한 생성자는 grade 를 받지 않는다(grade=50)

     

     

     

    왜 this를 사용하는가?

    name이라는 이름이 멤버 변수와 매개변수로 동일하기 때문에, 자바는 기본적으로 **지역 변수(매개변수)**를 우선합니다. 따라서, this.name을 사용하여 멤버 변수매개변수를 명확하게 구분하는 것이 필요합니다.

     

    this.name = name;
    • this.name: 여기서 this는 현재 객체의 인스턴스를 의미하므로, this.name은 클래스의 멤버 변수인 name을 가리킨다
    • name: 이 name은 생성자에 전달된 매개변수로, 생성자 호출 시 외부에서 제공된 값을 의미한다.

     

     

    this() 규칙

    this() 는 생성자 코드의 첫줄에만 작성할 수 있다.

     

     

     

     

    오버로딩(Overloading)

     

    오버로딩은 같은 이름의 메서드나 생성자를 여러 개 정의하는 것을 의미한다.

    • 동일한 메서드 이름을 사용하지만, 매개변수의 개수 또는 타입이 달라야 한다
    • 반환 타입은 오버로딩에 영향을 미치지 않고 메서드의 시그니처(메서드 이름과 매개변수 목록)가 달라야 한다.
    • 주로 메서드생성자에서 사용된다.
    public class Calculator {
        // 두 정수를 더하는 메서드
        public int add(int a, int b) {
            return a + b;
        }
    
        // 세 정수를 더하는 메서드
        public int add(int a, int b, int c) {
            return a + b + c;
        }
    
        // 두 실수를 더하는 메서드
        public double add(double a, double b) {
            return a + b;
        }
    }

     

     

     

    오버라이딩(Overriding)

    오버라이딩은 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것을 의미한다. 자식 클래스는 부모 클래스의 메서드를 그대로 사용하지 않고, 자신의 필요에 맞게 기능을 변경할 수 있다.

    • 메서드의 이름, 매개변수, 반환 타입이 부모 클래스와 완전히 동일해야 한다.
    • 접근 제어자(예: public, protected)는 부모 클래스의 메서드와 같거나 더 넓은 범위로 설정해야 한다. (예: protected를 public으로 변경 가능하지만, 반대로는 불가능)
    • @Override 애너테이션을 사용하여 오버라이딩을 명시할 수 있다.
    class Animal {
        // 부모 클래스의 메서드
        public void sound() {
            System.out.println("Animal makes a sound");
        }
    }
    
    class Dog extends Animal {
        // 부모 클래스의 sound 메서드를 오버라이딩
        @Override
        public void sound() {
            System.out.println("Dog barks");
        }
    }

     

     

    오버로딩(Overloading): 같은 클래스 내에서 같은 이름의 메서드를 다른 매개변수로 여러 개 정의하는 것.

     

    오버라이딩(Overriding): 부모 클래스에서 상속받은 메서드를 자식 클래스에서 재정의하는 것.

     

     

     

     

    문제

    BookMain 코드가 작동하도록 Book클래스 완성하기

     

    public class Book {
    
    	String title;
        String author;
        int page;
    }

     

    public class BookMain {
    	public static void main(String[] args) {
        
        Book book1 = new Book();
        book.displayInfo();
        
        Book book2 = new Book("Hello Java", "Seo");
        book2.displayInfo();
        
        Book book3 = new Book("JPA 프로그래밍", "kim", 700);
        book3.displayInfo();
        }
    }

     

     

     

     

    Book 클래스를 바꾸면,

    public class Book {
    
    	String title;
        String author;
        int page;
        
        Book() {
        	this("","",0);
        }
        
        // title과 author만을 매개변수로 받는 생성자
        Book(String title, String author) {
        	this(title, author, 0);
        }
        // 모든 필드를 매개변수로 받는 생성자
        Book(String title, String author, int page) {
        	this.title = title;
            this.author = author;
            this.page = page;
        }
        
        void displayInfo() {
        	System.out.println("제목: " + title + ", 저자: " + author + ", 페이지: " + page);
    }

     

     

     

    근데 원래 생성자 초기화할때

    Book() {
    	this.title = "";
        this.author = "";
    }
    
    // 이렇게 하는데 이걸 축약하면 아래와 같이 되는거
    
    Book() {
     this("","",0);
    }

    댓글

Designed by Tistory.