Java

[Java] 생활코딩 | 생성자, super, 메소드 오버라이딩, 메소드 오버로딩

kyra 2022. 11. 13. 14:11

https://youtu.be/9_5_bAVHd8c

1. 생성자

- 객체가 생성될 때 필수적으로 수행해야하는 작업을 처음에 세팅해 놓는 것

- 생성자의 이름은 클래스의 이름과 동리해야 한다.

- 값을 반환하지 않는다.

- 클래스에 생성자가 지정되지 않는 경우에는 묵시적 생성자가 자동으로 생성된다. (묵시적 생성자는 매개변수를 사용할 수 없다)

package org.opentutorials.javatutorials.constructor;
 
class Calculator {
    int left, right;
 
    public Calculator(int left, int right) { //생성자, Calculator 객체를 만들때 무조건 left와 right의 값을 지정하게 함
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }
}
 
public class CalculatorDemo1 {
 
    public static void main(String[] args) {
 
        Calculator c1 = new Calculator(10, 20);
        c1.sum();
        c1.avg();
 
        Calculator c2 = new Calculator(20, 40);
        c2.sum();
        c2.avg();
    }
 
}

2. 생성자의 여러가지 경우

 1) 묵시적 생성자가 없는 경우

class Cons1{
	public int num; //생성자 없이 클래스 생성
}

public class Constest1 {
	public static void main(String args[]) {
    Cons1 cons = new Cons1(); //클래스로부터 객체 생성 가능
    }
}

 

 2) 묵시적 생성자를 지정하는 경우

class Cons2{
	public int num;
    	System.out.println("묵시적 생성자"); //매개변수가 없는 묵시적 생성자 선언
}

public class Constest2 {
	public static void main(String args[]) {
    Cons2 cons = new Cons2(); //"묵시적 생성자"출력
    }
}

 

 3) 명시적 생성자가 있는 경우

class Cons3{
	public int num;
    public Cons3(String s){ //매개변수가 있는 명시적 생성자 선언, 클래스 이름과 동일해야함
    	System.out.println("묵시적 생성자"); 
    }
}

public class Constest3 {
	public static void main(String args[]) {
    Cons2 cons = new Cons3("1번쨰"); // 매개변수가 있는 경우
    //Cons3 cons2 = new Cons3(); : 오류 발생, 해당되는 생성자가 없다.Cons3은 무조건 매개변수가 있어야 함.
    //명시적 생성자가 하나라도 있으면 묵시적 생성자를 사용하기 위해서는 반드시 정의해야 한다.
    }
}
//1번째 명시적 생성자 출력

2. super

* super키워드는 부모 클래스를 의미한다. 여기에 ()를 붙이면 부모 클래스의 생성자를 의미하게 된다.

* super가 가장 먼저 나타나야 한다. 그 후 초기화 코드를 적어야 한다. 부모가 초기화 되기 전에 자식이 초기화 되는 일을 방지하기 위해


3. overriding (재정의)

* 상위 클래스의 기능을 하위 클래스가 물려 받을 때 수정할 수 있는 방법

- 상속 관계에 있는 클래스 간에 같은 이름의 메소드를 정의하는 경우

 

 주의 **메소드 오버로딩 : 같은 클래스 내에서 같은 이름의 생성자나 메소드를 사용하는 경우

 

* 오버라이딩을 하기 위해서는 메소드의 리턴 형식이 같아야 한다.

 - 메소드의 이름

 - 메소드 매개변수의 숫자와 데이터타입 그리고 순서

 - 메소드의 리턴 타입

 

* 만약 부모와 자식이 똑같은 코드를 갖고 있는 경우(중복을 제거하기 위해) :  super를 사용

class Calculator {
    int left, right;
 
    public void setOprands(int left, int right) {
        this.left = left;
        this.right = right;
    }
 
    public void sum() {
        System.out.println(this.left + this.right);
    }
 
    public int avg() {
        return ((this.left + this.right) / 2);
    }
}
 
class SubstractionableCalculator extends Calculator { //Calculator를 상속받는 SubstractionableCalculator 클래스
     
    public void sum() {
        System.out.println("실행 결과는 " +(this.left + this.right)+"입니다.");
    }
     
    public int avg() {
        return super.avg(); //부모클래스의 avg를 호출, 즉 (this.left + this.right) / 2 출력
    }

4. overloading

* 이름은 같지만 다른 메소드를 중복으로 선언하는 방법

* 메소드의 매개변수의 갯수, 형식이 다르다면 다른 메소드로 인식

package org.opentutorials.javatutorials.overloading.example1;
 
class Calculator{
    int left, right;
    int third = 0;
      
    public void setOprands(int left, int right){ //setOprands메소드 (2개의 매개변수)
        System.out.println("setOprands(int left, int right)");
        this.left = left;
        this.right = right;
    }
     
    public void setOprands(int left, int right, int third){ //setOprands메소드 (3개의 매개변수)
        System.out.println("setOprands(int left, int right, int third)");
        //this.left = left;
        //this.right = right; 여기서 this.left와 this.right는 위의 2개의 매개변수와 중복되므로
        this.setOprands(int left, int right) //left와 right는 위와 동일한 것으로 사용한다.
        this.third = third;
    }
     
    public void sum(){
        System.out.println(this.left+this.right+this.third);
    }
      
    public void avg(){
        System.out.println((this.left+this.right+this.third)/3);
    }
}
  
public class CalculatorDemo {
      
    public static void main(String[] args) {
          
        Calculator c1 = new Calculator();
        c1.setOprands(10, 20); //매개변수가 2개인 메소드를 사용
        c1.sum();       
        c1.avg();
        c1.setOprands(10, 20, 30); //매개변수가 3개인 메소드를 사용
        c1.sum();       
        c1.avg();
         
    }
  
}

5. 오버로딩의 규칙

package org.opentutorials.javatutorials.overloading.example1;
public class OverloadingDemo {
    void A (){System.out.println("void A()");} //매개변수 없음
    void A (int arg1){System.out.println("void A (int arg1)");} //매개변수 int로 1개
    void A (String arg1){System.out.println("void A (String arg1)");} //매개변수 string으로 1개
    //int A (){System.out.println("void A()");} -> 오류 발생, 위의 매개변수 없는 void a()와 헷갈림
    
    public static void main(String[] args) {
        OverloadingDemo od = new OverloadingDemo();
        od.A(); //매개변수 없는 메소드
        od.A(1); //매개변수 int 1개 메소드
        od.A("coding everybody"); //매개변수 string 1개 메소드
    }
}

* 메소드의 이름은 같고, 매개변수는 같지만 리턴 타입이 다르면 오류가 발생한다. 매개변수의 이름은 달라도 상관 없음