국비교육(22-23)

14일차(3)/java(9) : Method (Overloaded Method)

서리/Seori 2022. 10. 25. 23:33

14일차(3)/java(9) : method (overloaded method)

 

System class와 다중정의된 메소드

 

우리가 java로 프로그래밍할때 필요한 다양한 type 객체가 있는데,
1. 필요한 객체를 직접 new해서 사용하는 경우
2. 메소드를 호출해서 필요한 객체를 return type으로 받아와서 사용하는 경우
3. 필요한 객체가 특정클래스의 static 필드에 이미 저장되어 있어 그 값을 참조해서 사용하는 경우

위의 3가지가 가장 전형적인 패턴!

1. 직접 만들어서 사용하기.

 → 필요한 물건을 만들어서 사용하기
2. 하지만 직접 만들 수 없는 경우도 있다. 그런 경우 메소드를 통해서 받아와서(리턴값) 사용

 → 필요한 물건을 다른 곳에서 받아와서 사용하기
3. 이미 만들어진 어떤 클래스의 static필드에 들어있는 값을 참조

 → 저장되어 있는 것을 참조하기.
 → 3번을 이미 해본적 있다!(★System.out, public class System. PrintStream out, ... )


public class System {
     public static void main( ) {}

          System.out.println("")

}

- System 또한 클래스이고, out은 System의 필드이다!
 콘솔창에 출력할 수 있는 능력을 가진 객체가 System 안에 준비되어 있는 것이다!

 

- 1,2,3중 어떤것을 사용하느냐는 어떤 객체냐에 따라 다르다.

 


 

<Car> 앞에서 복사해온 것

package test.mypac;
/*
 * class의 역할
 * 
 * 1. 객체의 설계도 역할
 * 2. data type 역할
 * 3. static 필드와 메소드를 포함하는 역할
 */
public class Car {
	//저장소(field)
	public String name;
	
	//달리는 기능(method)
	public void drive() {
		/*
		 * 이 클래스로 객체가 생성된다면 바로 그 객체의 참조값을 가리키는 예약어가 this이다.
		 */
		System.out.println(this.name+" 이(가) 달려요!");
	}
	
	//멈추는 기능(method)
	public void stop() {
		System.out.println("멈춰요!");
	}
}

 

- javascript에는 console, alert, ... 등 미리 만들어진 함수들이 있다.(global 영역에 만들어져 있다)
- java에는 전역변수라는 개념 자체가 없다.
 대신 클래스의 static field에 넣어둔다. static field에 이미 생성되어서 들어가 있다!

 

- System이라는 클래스 안에 들어있는 static field, static method의 목록

 

- 뒤에 뜨는 것은 모두 PrintStream type의 다양한 기능들

 

 

- new나 println 과 같은 기능을 설정한 적은 없지만 쓸 수 있다. 

  java에 이미 만들어져 있는 기능을 참조해서 사용한다!

 

- java는 이런 작업을 할 때 어떤 객체의 도움을 받아야하는지 배우는 것.

 어떤 타입 객체의 어떤 메소드를 활용하면 되는가를 배우는 것!

 


 

- System 글자 위에 커서를 올리면 설명이 뜨는데, class설명이 잘 되어 있다.

 브라우저에 들어가서 해당 클래스의 설명을 볼 수 있다!

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/lang/System.html

 

- System 클래스는 어떻게 import 안해도 사용할 수 있지?

→ 패키지 java.lang / java.lang 안에 들어있는 기능은 import없이 볼 수 있다.

 

- 공개되어 있지만, 수정은 불가능한 필드 (final이라는 예약어 사용)

- final : 값이 한번 결정되면 바꿀 수 없다.(=javascript const 변수 선언과 비슷함)

  중요한 객체가 들어있기 때문에 바꿀 수 없는 것!

 

- System이라는 클래스에서

 heap영역의 println() 이라는 메소드를 호출할 수 있는 참조값을

 out이라는 static field에 넣어둔 것이다.

 

- 특별한 객체의 참조값을 넣어둔 것.

 27번 키 값을 획득하는 방법은 out.이라는 필드를 참조하는 것이다!

 


 

[ 메소드의 다중정의(Overload) ]

 

<MyObject>(일부)

package test.mypac;
/*
 * [ 메소드를 만들때 고려해야 하는 것 ]
 * 
 * 1. 접근 지정자(공개범위)
 * 2. static or non-static
 * 3. 리턴 type
 * 4. 메소드명
 * 5. 메소드에 전달하는 인자의 갯수와 데이터 type
 */
public class MyObject {
		
	public void send() {
		System.out.println("무언가를 전송해요");
	}
	
	public void send(int num) {
		System.out.println(num+"를 전송해요");
	}
	
	public void send(String name) {
		System.out.println(name+"을 전송해요");
	}
	
	public void send(Car car) {
		System.out.println("자동차를 전송해요");
	}	
}

 

<MainClass02>

package test.main;

import test.mypac.Car;
import test.mypac.MyObject;

public class MainClass02 {
	public static void main(String[] args) {
		
		/*
		 * 콘솔창에 "안녕하세요" 를 출력하려고 한다.
		 * 해당 목표를 달성하려면 콘솔창에 출력을 할 수 있는 기능을 가진 객체가 필요하다.
		 * 그 객체는 어디에 있나? System 클래스의 out이라는 static 필드에 해당 객체의 참조값(키값)이 들어있다.
		 * 그 객체는 무슨 type인가? PrintStream type
		 * 그 객체를 누가 생성했나? java에서 이미 생성해서 미리 준비된 객체이다.
		 * System 클래스는 왜 import 안해도 사용할 수 있지?
		 * System, String 등의 클래스는 java.lang 패키지에 들어있는 클래스이며, 해당 패키지에 있는 모든 클래스는
		 * 마치 기본 클래스처럼 import 없이 사용할 수 있다.
		 */
		
		//다중정의(overloading 된 println() 메소드 사용해 보기)
		System.out.println("안녕하세요");
		System.out.println(999);
		System.out.println(true);
		System.out.println('a');
		
		MyObject mo=new MyObject();
		mo.send();
		mo.send(1);
		mo.send("바나나");
		mo.send(new Car());
	}
}

- 같은 이름의 메소드라도 여러 가지로 정의할 수 있다.

 

- 자동완성되는 것을 보면 이름은 같지만 다양한 인자를 가진다.

 

- 메소드명은 같지만 다양하게 정의되어 있는 메소드들이 있다.
 '메소드가 다중정의되어 있다' 고 한다.(overloading)

- true 타입을 전달하면 boolean 타입으로 받고, 숫자를 전달하면 int 타입으로, 문자열을 전달하면 string타입으로 받는 것.
 여러 타입을 받을 준비가 되어있는 메소드이다!

 

public void send(int num) {
    System.out.println(num+"를 전송해요");
}

public void send(String name) {
    System.out.println(name+"을 전송해요");
}

public void send(Car car) {
    System.out.println("자동차를 전송해요");
}

- send라는 메소드를 정의할 때 어떤 데이터타입의 인자를 받을 것인지를 명시한다.

- 여러개 만들면 만드는 대로 정의된다!(다중정의)

 

- 다른 클래스에서 테스트해보면 다중정의되어 있는 것 확인 가능!

  다 똑같아 보이는 send 메소드이지만 받는 인자가 다르다.