본문 바로가기
Study/Java

[Java] 메서드, 오버로딩, 오버라이딩

by JYHAN 2020. 7. 1.

메서드(Method) 선언과 호출

// 메서드 선언
public void getInfo(String who){
	// public: 접근자
	// void: 반환형
	// getInfo: 메서드이름
	// String who: 매개변수
    
// 메서드 정의
	System.out.println("12");
}
// 호출
ClassMate class1 = new ClassMate();
class1.getInfo("John");

 

매개변수(Parameter)

메서드를 호출할 때 데이터를 전달할 수 있다

 

중복 메서드(Overloding)

이름은 같고, 매개변수의 개수 또는 타입이 다른 메서드를 만들 수 있다

메소드의 이름은 같고, 매개변수의 갯수, 타입, 순서는 달라야 한다

단, 리턴 값만 다른 경우 오버로딩을 할 수 없다

public void getInfo() {
	System.out.println("Hello");
}
public void getInfo(int num1) {
	System.out.println("Hello %d",num1);
}
public void getInfo(int num1, int num2) {
	System.out.println("Hello %d %d", num1, num2);
}

// 매개변수의 순서가 다른 경우
public void getInfo(int num1, double num2) {
	System.out.println("Hello %d %f", num1, num2);
}
public void getInfo(double num2, int num1) {
	System.out.println("Hello %d %f", num1, num2);
}

 

오버 라이딩(overriding) -> 상속개념 이해 필요

상위 Class에서 정의한 메서드를 하위 Class에서 사용하는 것

또한, 하위 Class에서 메서드를 재정의해서 사용할 수 있다

class Dog{ // 상위 클래스
    public int age;
    public String color;
    
    // 메서드
    public void getInfo(){
        System.out.println("나이는 "+age+"이고 색은 "+color+"입니다");
    }
    
}
 
class Cat extends Dog{ //Dog를 상속받음
 
    String eyeColor;
    
    public void getInfo() {//상위 클래스에 있는 getInfo()메서드를 재정의
        System.out.println("눈은 "+eyeColor+"색입니다");
    }
}
 
public class MainClass {
    public static void main(String[] args) {
        //Cat 객체 생성
        Cat catt = new Cat();
        
        //변수 설정
        catt.age = 1;
        catt.color = "white";
        catt.eyeColor = "blue";
        
        //호출
        catt.getInfo();   
    }
}

--- result ---
눈은 blue색입니다

 

상위 클래스에 있는 getInfo 메서드도 호출하고 싶다면??

class Dog{ // 상위 클래스
    public int age;
    public String color;
    
    // 메서드
    public void getInfo(){
        System.out.println("나이는 "+age+"이고 색은 "+color+"입니다");
    }
    
}
 
class Cat extends Dog{ //Dog를 상속받음
 
    String eyeColor;
    
    public void getInfo() {//상위 클래스에 있는 getInfo()메서드를 재정의
        super.getInfo();
        System.out.println("눈은 "+eyeColor+"색입니다");
    }
}
 
public class MainClass {
    public static void main(String[] args) {
        //Cat 객체 생성
        Cat catt = new Cat();
        
        //변수 설정
        catt.age = 1;
        catt.color = "white";
        catt.eyeColor = "blue";
        
        //호출
        catt.getInfo();   
    }
}

--- result ---
나이는 1이고 색은 white입니다
눈은 blue색입니다

하위 클래스에서  메서드를 재정의 할 때, 

1. super.getInfo()를 사용 

2. 상위 클래스의 메서드를 똑같이 작성한다

System.out.println("나이는 "+age+"이고 색은 "+color+"입니다");

 

접근자

메서드를 호출할 때 접근자에 따라서 호출이 불가할 수 있다

public void getInfo1(){
	System.out.println("호출 가능");
}
private void getInfo2(){
	System.out.println("호출 불가능");
}

 

객체와 메모리

메모리에서 객체 생성(동적 생성)

객체는 메모리에서 동적으로 생성되며, 객체가 더 이상 필요 없게 되면 GC(Garbage Collector)에 의해서 제거

 

레퍼런스

생성한 객체의 주소를 변수에 저장하는 것을 레퍼런스라고 한다

같은 클래스에서 객체를 생성했을 때,  모두 다른 주소를 갖는다

		Dog d1 = new Dog();
		Dog d2 = new Dog();
		Dog d3 = new Dog();
		
		System.out.println("d1 addr: "+d1);
		System.out.println("d2 addr: "+d2);
		System.out.println("d3 addr: "+d3);
        
		--- result ---
		d1 addr: basic.Dog@2d363fb3
		d2 addr: basic.Dog@7d6f77cc
		d3 addr: basic.Dog@5aaa6d82

 

자료형이 같아도 다른 공간에 존재하는 객체는 다른 객체이다

 

null과 NullPointException 

레퍼런스에 null이 저장되면 객체의 연결이 끊기며, 더 이상 객체를 이용할 수 없다

		Dog d1 = new Dog();

		System.out.println("d1 addr: "+d1);
		d1.play();
		
		d1 = null;
		System.out.println("d1 addr: "+d1);
		d1.play();
        
		--- result ---
		d1 addr: basic.Dog@2d363fb3
		play
		d1 addr: null
		Exception in thread "main" java.lang.NullPointerException
			at basic.MainClass.main(MainClass.java:26)

 

 

정리

오버라이딩(재정의) -> 이름 동일, 내용 다름

오버로딩(중복정의) -> 이름 동일, 파라미터(매개변수) 다름

댓글