DAY+10 메소드 (method)

2020. 9. 3. 15:52Web_Back-end/JAVA_선행

메소드(method) 

  • 메소스 : 입력을 받아서 처리결과를 반환하는 상자
    • 각 메소드는 하나의 작업만 하도록 작성 (권장함)
    • 각 메소드는 이름을 가지고 있다 (이름을 통해 호출//무명함수는 제외)
  • 구조 
반환형 메소드 이름(매개변수...){
	메소드몸체
}

 

◎ 인수와 매개변수

  • 인자 == 매개변수 == 파라미터 : 함수를 정의할 때 외부로부터 받아들이는 값
  • 인수(argument) : 함수를 호출할 때 사용되는 값
  •  

public static void main(String[] args)

public

  • 접근 지정자 : 제한없이 어디서든 사용 가능한 범위를 뜻함
  • public 이외의 접근지정자 : private, protected

static

  • 정적 (이라는 뜻) // 메소드에 붙이면 정적메소드라고 부름
  • static으로 선언하면 자바가 컴파일되는 시점에서 정의된다
  • 객체를 생성하지 않아도 사용할 수 있다

 void

  • 메소드의 반환형 // void 는 반환값이 없거나 반환할 필요가 없다는 뜻

 main

  • 메소드의 이름

(String[] args)

  • 메소드의 매개변수 // 이름이 args 인 String 타입의 배열이라는 뜻

 

static 

  • static 은 자바 프로그램이 실행 되기전에 static 변수나 static 함수를 메모리의 첫 단계로 올린 후 실행된다
  • 프로그램이 실행되는 동안 사라지지 않는다
  • main 함수에 static 을 사용하는 이유
    • main() 함수는 프로그램의 시작점이기 때문에 실행과 동시에 실행되어야 한다
    • main() 도 메소드이기 때문에 누군가가 호출해야 메모리에 올라간다
    • 따라서, 프로그램 실행과 동시에 호출이 가능하도록 미리 메모리에 올리기 위해서 static을 사용한다
  • 상수선언(static final)
    • 변수의 용도와 의미를 고정시켜 프로그램이 실행되는 동안 바뀌지 않기 때문에 static으로 선언(관례)

 

◎ 메소드의 반환값

  • 메소드는 자신을 호출한 코드에 값을 반환 할 수 있다
  • 메소드는 return 문장을 사용해서 값을 반환한다
    • 반환값이 없는 경우 : void 메소드이름 (값을 반환하면 오류 발생)
    • 반환값이 있는 경우 : 반환형 메소드이름
    •                             return 반환값; 형태로 값을 반환한다
    • 이때, 반환형반환값의 자료형은 동일해야한다

 

◎ 메소드의 종료

  • 메소드가 종료되는 조건
    1. } 를 만나면 종료
    2. return 문장이 실행되면 종료 // return문장은 값을 반환할 수도 있고, 반환값 없이 종료할 수도 있다
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		myMethod1();
		int result = myMethod2(10,4);
		System.out.println(result);
	}

	static void myMethod1() {
		System.out.println("반환 값이 없는 void형 메소드");
	}
	
	static int myMethod2(int x, int y) {
		return x+y;
	}

< 예제 1 / Television 클래스에 void 메소드 추가해보기 >

  • D+1~9 기존 방법 : main()에서 필드 값에 접근
  • 권장 방법 : Television 이 가지고 있는 데이터는 Television  객체 안에서 출력
  • 실습해보기 : Television 안에 print() 네소드 추가 (channel, volume 변수 출력하는 기능)
public class Television {
	
	int channel;
	int volume;
	boolean onOff;
	
    
    //print()안에서 필드를 사용할 때는 멤버연산자(.)를 사용하지 않는다
    //(ex: tv.channel 이라고 안함)
	void print() {
		System.out.println("채널은: " + channel + "이고 볼륨은: " + volume + "이다.");
	}
	
}

※ ptint() 안에서 필드 사용 시 멤버연산자 사용하지 않는 이유

  • main() 에서 메소드를 호출할 때 호출한 객체의 변수라고 암묵적으로 간주된다
  • tv.print(); 로 호출할 경우 tv 객체의 변수하고 (알아서) 간주하는 것

 


◎ toString() 함수

  • 이클립스에 자동으로 만들 수 있는 함수
  • alt + shift + s --> generate toString() 을 통해 생성

< 예제 2 / Television 클래스에 현재 채널을 반환하는 메소드 추가 >

int getChannel(){
	return channel;
}

※ channel 의 값을 반환하는 메소드 추가

< 예제 3 / Television 클래스에 매개변수가 있는 메소드 추가 >

void setChannel(int ch){
	channel = ch;
}

※ 채널을 설정하는 setChannel(int ch) 메소드를 추가하기

▲ get, set 은 관례적으로 사용하고 있다

종류 get set
의미 값을 가져오는 함수 값을 설정하는 함수
생성방법 alt + shift + s -> getter , setter 로 자동생성
[source] -> [generate] 에서도 가능
getter setter가 필요한 이유 캡슐화의 정보은닉과 관련된 개념

 

< 예제 4 / 자동차 클래스 생성하기 >

  1. Car class 생성
  2. 필드 ( String color, int speed, int gear )
  3. 메소드 ( changeGear(), speedUp() // speed+10 , speedDown() // speed-10 )
  4. toString() 메소드 추가( 자동으로 추가해보기 )
//1. car 클래스 생성
public class Car{
//2. 필드 작성	
    String color;
    int speed;
    int gear;

//3. 메소드 선언
    void changGear(int g){
    	gear = g;
    }
    void speedUp(){
    	speed+=10; 
    }
    void speedDown(){
    	speed-=10;
    }
    public String getColor(){
    	return color;
    }
    public void setColor(String color){
    	this.color = color;
        //여기서 this 후설참조
        
//4. 자동으로 생성되는 toString() 메소드 추가
  	@Override
	public String toString() {
		return "Car [color=" + color + ", speed=" + speed + ", gear=" + gear + "]";
    }
}

this.color = color; // color 는 필드 / color  매개변수

★ 자동으로 만들었기 때문에 필드와 매개변수 이름이 같게 나온다 따라서 this. 가 붙음

this.필드 = 매개변수;

보통 이렇게 같게 사용한다 (직접 만들때도)


◎ 메소드 오버로딩 (overloading)

  • 동일한 이름의 메소드를 여러개 정의하는 것/ 단, 매개변수가 달라야한다
  • 매개변수가 다르다 → 매개변수의 개수나 자료형을 다르게 정의하는 것을 의미
  • ex) println()
    • void println(int x)
    • void println(String y)
    • void println(double z)

< 간단한 예제 제곱 값을 구하는 메소드 square() 를 오버로딩으로 다양한 자료형 받기 >

public class Root {

	public static void main(String[] args) {
		
		System.out.println(square(3));
		System.out.println(square(3.0));
	}
	
	static int square(int a) {
		return a*a;
	}
	static double square(double a) {
		return a*a;
	}
}

//console
//9
//9.0

String 클래스 사용

  • 자바에서 문자열은 객체다 (=String 은 정수 int나 실수 double 같은 기초자료형이 아님)
  • 원칙 
    • String s = new String("Hello");
    • 하지만, 자주쓰는 객체라서 new 연산자를 생략해도 생성된다
  • 문자열 안의 인덱스는 0부터 시작한다
  • String 객체는 생성되면 내용 변경이 불가능하다 (immutable)
    • String pizza = "맛있는 피자";
    • pizza = "피자 먹을래!";
    • 이같은 경우에, pizza가 수정된 것이 아니고 새로 할당 된 것이다. 따라서 "맛있는 피자"는 삭제된다 (GC 대상)

 

Wrapper class

  • 자바는 정수나 실수같은 기초 자료형을 제외하고, 모든 것이 객체로 되어있다
  • 기초자료형을 객체로 포장하고 싶은 경우에  wrapper class를 사용한다
  • 객체로 포장해야하는 경우
    • 매개변수로 객체가 요구될 때
    • 기본형 값이 아닌 객체에 저장해야 할 때
    • 객체간의 비교가 필요할 때
  • 모든 기초자료형에 대해 해당되는 클래스가 존재한다
기초자료형 래퍼클래스
int Integar
char Charactor
double Double
byte Byte
short Short

 

 Boxing 과 unBoxing // jdk 1.5 버전부터  auto 지원함 개념만 알아두기

  1. Boxing int →  Integar
    • 기초 자료형을 객체로 만드는 것
  2. unBoxing Integar  →  int
    • 객체에서 기초자료형의 값을 얻는 것
    • ex) 문자열을 기초자료형 값으로 변환 (parse~)
      • parseInt(), parseDouble()