국비교육(22-23)

14일차(2)/java(8) : Method

서리/Seori 2022. 10. 25. 22:24

14일차(2)/java(8) : Method

 

- 이클립스에서 프로젝트명을 수정하고 싶을 경우

 프로젝트폴더 우클릭 - refactor - rename 으로 들어가기!

 


 

<MyObject>

package test.mypac;
/*
 * [ 메소드를 만들때 고려해야 하는 것 ]
 * 
 * 1. 접근 지정자(공개범위)
 * 2. static or non-static
 * 3. 리턴 type
 * 4. 메소드명
 * 5. 메소드에 전달하는 인자의 갯수와 데이터 type
 */
public class MyObject {
	
	public void walk() {
		System.out.println("걸음을 걸어요");
	}
	
	public int getNumber() {		
		return 10;
	}
	
	public String getGreeting() {
		return "안녕하세요";
	}
}

 

<MainClass01>

package test.main;

import test.mypac.MyObject;

public class MainClass01 {
	public static void main(String[] args) {
		/*
		 * MyObject 객체를 하나만 생성해서 그 객체가 가지고 있는
		 * walk(), getNumber(), getGreeting() 메소드를 차례로 호출해 보세요.
		 * 단, 메소드가 어떤 data를 리턴하면 해당 데이터를 지역변수에 담으세요.
		 */
		MyObject mo=new MyObject();
		mo.walk();
		int num=mo.getNumber();
		String greet=mo.getGreeting();
	}
}

 

[ 메소드를 만들때 고려해야 하는 것 ]
1. 접근 지정자(공개범위)
2. static or non-static
3. 리턴 type
4. 메소드명
5. 메소드에 전달하는 인자의 갯수와 데이터 type

- 코드 한 줄만 봐도 메소드의 성격을 파악할 수 있다.

ex) public void walk () {} 
1 public / 2 non-static / 3 void / 4 walk / 5 인자의 개수 0개(비어있음)

ex) public int getNumber() {}
1 public / 2 non-static / 3 int / 4 getNumber / 5 0개

ex) public String getGreeting() {}
1 public / 2 non-static / 3 String / 4 getGreeting / 5 0개

 

- void : 리턴 타입이 없다는 것을 표시한다.

 이 메소드는 호출만 할 뿐 어떤 결과를 받아가지 않는다. 어떤 타입도 리턴하지 않는다!


 

- 객체 생성은 예약어 new를 사용! new를 한번만 사용하기
- new하면 heap영역에 myObject 객체가 만들어진다.
 → walk, getNumber, getGreeting 이라는 메소드를 가지고 있는 객체이다.

 

- 이 객체를 하나만 만들어서 세 번 사용하기 위해서는 변수(mo)에 담으면 된다.

 메소드를 사용하기 전에 만든 메소드의 리턴값을 확인해 볼 수 있다.

- 각각의 메소드를 실행하고 리턴값을 지역변수에 담으면 된다.

→ void는 어차피 리턴값이 없어 담을 수가 없다.나머지는 각각의 리턴타입에 맞춰서!

 

- 디버깅모드에서 확인해보면, 각각의 지역변수에 지정한 참조값이 담기는 것을 볼 수 있다.

 


 

- mypac 안에 Car 클래스를 복사해줌. 같은 패키지 안에 있다면 car는 import하지않고 바로 쓸 수 있다.

 myObject에 public Car getCar() 를 추가한다.

 

위에서 일부 수정한 파일!

 

<MyObject>

package test.mypac;
/*
 * [ 메소드를 만들때 고려해야 하는 것 ]
 * 
 * 1. 접근 지정자(공개범위)
 * 2. static or non-static
 * 3. 리턴 type
 * 4. 메소드명
 * 5. 메소드에 전달하는 인자의 갯수와 데이터 type
 */
public class MyObject {
	
	public void walk() {
		System.out.println("걸음을 걸어요");
	}
	
	public int getNumber() {		
		return 10;
	}
	
	public String getGreeting() {
		return "안녕하세요";
	}
	//Car type을 리턴해주는 메소드	
	public Car getCar() {
		return new Car();
	}
	//int type 을 메소드의 인자로 전달받는 메소드
	public void setNum(int num) {
		System.out.println("num:"+num);		
	}
	//string type을 메소드의 인자로 전달받는 메소드
	public void setName(String name) {
		System.out.println("name:"+name);		
	}
	//car type을 메소드의 인자로 전달받는 메소드
	public void useCar(Car car) {
		car.drive();
	}
	
	public void doSomething(int num, String msg, Car c) {
		System.out.println("무언가를 작업합니다.");
	}
}

 

<MainClass01>

package test.main;

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

public class MainClass01 {
	public static void main(String[] args) {
		/*
		 * MyObject 객체를 하나만 생성해서 그 객체가 가지고 있는
		 * walk(), getNumber(), getGreeting() 메소드를 차례로 호출해 보세요.
		 * 단, 메소드가 어떤 data를 리턴하면 해당 데이터를 지역변수에 담으세요.
		 */
		MyObject mo=new MyObject();
		mo.walk();
		int num=mo.getNumber();
		String greet=mo.getGreeting();
		Car car=mo.getCar();
		
		//setNum(), setName(), useCar() 메소드도 호출해 보세요.
		//메소드를 호출하면서 인자로 전달할 데이터를 즉석에서 만들어서 전달하기 
		mo.setNum(1);
		mo.setName("바나나");
		mo.useCar(new Car());
		
		//메소드 호출하면서 인자로 전달할 값이 지역변수에 이미 존재하는 경우라고 가정하자
		int a=999;
		String b="누구게";
		Car c1=new Car();
		
		//전달할 값이 들어 있는 변수명으로 전달할수도 있다.
		mo.setNum(a);
		mo.setName(b);
		mo.useCar(c1);
		
		//doSomething() 메소드를 호출해 보세요
		mo.doSomething(1, "이름", new Car());
		mo.doSomething(a, b, c1);
	}	
}

- 리턴타입 말고 메소드의 인자로 사용되는 타입을 알아보기.

- MyObject의 개체를 하나만 생성한다 → new 를 한번만 사용한다!

 

- 인자 부분에 타입명+변수명을 함께 넣어준다.

- javascript 였다면 function setNum(num){ } 과 같이 매개 변수의 이름만 들어가면 됐는데 java는 타입명이 필요!

 

 

 

- 밑에 자동완성되는 메소드의 형태를 보고, 대입될 값을 setNum( ) 안에 써주어야한다. 

- 인자가 있는 형태로 만들어진 메소드라면 mo.setNum(); 만으로는 호출이 되지 않는다.

 처음에 만든 대로 int type의 값을 넣어주어야한다!

 

- car type의 참조값은? new Car() 하면 얻어낼수있다!

 

 


 

- mo.setNum(); 의 () 안에 들어갈 내용은 인자뿐만 아니라 이미 만들어진 변수도 가능하다.

 a, b, c1과 같이 이미 작성되어 있는 변수도 타입이 맞다면 넣을 수 있다.

 


//MyObject//
public void doSomething(int num, String msg, Car c) {
		System.out.println("무언가를 작업합니다.");
	}

//MainClass//
mo.doSomething(1, "이름", new Car());
mo.doSomething(a, b, c1);

- 3개의 인자를 가지는 doSomething 이라는 method를 만들어줌

 (3개의 인자는 각각 숫자, 문자열, car 타입)

- 여기에는 이미 정해진 값(변수)을 넣어 줄 수도 있고, 즉석에서 새로 값을 만들어서 넣어줄수도 있다!

 

- javascript의 '매개변수'와 java의 '인자'는 비슷한 개념이라고 생각하면 된다.

 javascript 에서는 type을 선언하지 않고 / java에서는 type을 선언해야 한다는 차이점만 있을뿐!

 


 

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

- 위에서 1, 2를 진행해본 것. 다음 게시물에서 3번 할 예정!