메소드는 크게 리턴값이 존재하는 메소드와 그렇지 않은 메소드로 나눌 수 있다. 리턴값이 존재한다는 것은 메소드가 실행되고 난 후 반환할 값이 존재한다는 것이고 리턴값이 존재하지 않는 것은 메소드가 실행되고 반환할 값이 없다는 것을 의미한다. 이때 리턴 타입이 void가 아니지만 return문이 없다면 오류가 발생하게 된다. 

 

 메소드에서는 return문을 실행하면 그 즉시 메소드가 종료된다. 따라서 return문 이후에 코드를 작성하게 되면 'Unreachable Code'라는 문구와 함께 오류가 발생하는 것을 볼 수 있다. 말 그대로 도달할 수 없는 코드라는 뜻이다. 하지만 조건문과 같이 특수한 상황에는 return문 뒤에 있어도 코드가 실행될 수 있다. 꼭 return문 뒤에 작성할 수 없다는 뜻은 아니다. 

 

 이런 return문은 메소드 내에서 여러개가 쓰여도 된다. 

public int returnNumber(int a){
	if(a==1){
    	return 1;
    } else {
    	return 0;
    }
}

 위의 코드를 살펴보면 매개 변수로 들어온 a가 1일 경우 1을 반환하고 아니면 0을 반환하는 구조이다. 이처럼 2개가 와도 되고 그 이상으로 있어도 된다.

 

 메소드의 리턴 타입 중 void라는 녀석이 있다. 이 녀석은 값을 반환하지 않겠다는 의미인데 이 녀석을 반복문과 같이 사용할 때 주의해야 한다. 만약 리턴 타입을 void라고 작성한 후 안에 while문을 같이 썼다면 while문은 끝내는 조건이 없을 경우 잘못하면 무한루프 상태에 빠지게 된다. 따라서 이러한 경우에는 꼭 반복문을 끝낼 수 있는 break문을 사용하거나 return ;을 통해 아무런 값도 반환하지 않고 메소드를 종료해야 한다.

'프로그래밍 > JAVA' 카테고리의 다른 글

메소드 - Method  (0) 2021.04.30
생성자 오버로딩(Overloading)  (0) 2021.04.30
this  (0) 2021.04.30
생성자  (0) 2021.04.30
클래스의 구성 요소  (0) 2021.04.29

 메소드는 이전에 객체에서 동작을 담당하는 구역이라고 말한 바 있다. 메소드는 크게 리턴 타입, 이름, 매개 변수, 중괄호로 이루어져 있다. 객체를 생성한 후 실행 클래스에서 해당 객체의 메소드를 실행하게 되면 그 이름에 맞는 메소드는 중괄호 내의 모든 코드를 실행한다. 메소드는 주로 객체 내의 데이터 값을 수정하고 필드를 초기화하는 등의 역할을 하지만 또 다른 객체를 생성하기도 하고 객체 간의 데이터를 주고받기도 하는 등의 다양한 동작을 행한다.

 

 그럼 메소드 선언부 중 리턴 타입에 대해 알아보겠다. 리턴 타입은 말 그대로 메소드가 실행되고 리턴되는 데이터의 타입을 의미한다. 만약 int형으로 반환하겠다 하면 int형으로 선언하면 되고 String형은 String으로 선언하면 된다. 이때 메소드를 void로 선언하게 될 경우 리턴 값이 없다는 것을 의미한다. 메소드에서는 리턴되는 값이 있냐 없냐에 따라 실행 클래스에서 메소드를 실행하는 방식도 달라지게 된다.

public void printString(){
	System.out.println("12345");
}

public int returnNumber(){
	return 1;
}

 위처럼 2개의 메소드가 있다고 가정했을 때 위의 printString메소드는 단순히 '12345'를 출력하고 종료된다. 하지만 아래의 returnNumber메소드는 1을 반환하므로 이 1이 저장될 변수가 필요하다. 때문에 실행시에는 아래와 같이 해야한다.

printString();
int number=returnNumber();

 이때 주의할 점은 Return_number메소드의 리턴 타입과 결괏값을 저장할 변수의 자료형이 같아야 한다는 것이다. 만약 다를 경우에는 자료형을 맞춰서 저장해주어야 오류가 발생하지 않는다.

 

 다음으로 메소드 선언부 중에서 메소드 이름 부분에 대해 알아보겠다. 이 부분은 크게 볼 것이 없어서 간단히 넘어가겠다. 아래는 메소드 이름을 지을 때 주의해야 할 몇가지 규칙이다.

 

 - 숫자로 시작할 수 없고, $,_를 제외한 특수문자를 사용할 수 없다.

 - 관례적으로 메소드 이름은 소문자로 작성한다.

 - 서로 다른 단어가 이어진 메소드 이름일 경우 뒤의 오는 단어의 첫글자는 대문자로 작성한다.

 

 마지막으로 매개 변수 부분에 대해서 알아보도록 하겠다. 매개 변수가 존재하는 이유는 메소드를 실행할 때 메소드 내에서 필요한 데이터를 외부로부터 전달받기 위해 존재한다.

public int plusValue(int a, int b){
	return a+b;
}

 위의 메소드는 간단하게 매개 변수로 들어온 a와 b를 더해서 반환하는 구조로 되어있다. 이를 실행하기 위해서는 매개 변수 값으로 2개의 값을 전달해야 하지만 만약 1개만 전달하거나 전달하지 않을 경우 오류가 발생하게 된다. 또 int값이 아닌 다른 값(float이나 double)과 같은 값을 넘겨주게 되면 오류가 발생한다.

 

 그러면 전체적으로 클래스 내부에서의 구조와 이를 실행하려면 어떤 식으로 해야하는지 알아보겠다.

public class Person {
	String name;
    int age;
    int height;
    
    Person(String name, int age, int height){
    	this.name=name;
        this.age=age;
        this.height=height;
    }
    
    public String returnName(){			// 이름을 반환하는 메소드
    	return name;
    }
    
    public void modifyAge(int age){		// 나이를 수정하는 메소드
    	this.age=age;
    }
}

 위의 코드는 클래스이고 아래의 코드는 실행 클래스에서의 객체 생성과 메소드 실행 방법이다.

Person p1=new Person("Kim", 22, 180);
String name=p1.returnName();
p1.modifyAge(20);

 위의 코드처럼 실행하게 되면 처음에 설정한 name을 반환받게 되고 age 필드는 처음에 22로 설정되었다가 후에 20으로 수정된다.

'프로그래밍 > JAVA' 카테고리의 다른 글

return문  (0) 2021.04.30
생성자 오버로딩(Overloading)  (0) 2021.04.30
this  (0) 2021.04.30
생성자  (0) 2021.04.30
클래스의 구성 요소  (0) 2021.04.29

 이전 포스팅에서 생성자는 하나 이상 작성할 수도 있다고 얘기했었다. 그렇다면 이번에는 여러 개를 사용하려면 어떻게 해야 하는지에 대해 알아보도록 하겠다. 우선 파파고에 overloading을 검색해본 결과 '과적'이라고 나온다. 어찌보면 여러 개가 쌓여 있는 모습이 그렇게 보일수도 있겠다. 그러면 잡소리는 치우고 바로 본론으로 들어가겠다. 아래의 예시를 살펴보겠다.

public class Person {
	String name;
    int age;
    int height;
    
    Person(){ // 1
    }
    
    Person(String name){ // 2
    	this.name=name;
    }
    
    Person(String name, int age){ // 3
    	this.name=name;
        this.age=age;
    }
    
    Person(String name, int age, int height){ // 4
    	this.name=name;
        this.age=age;
        this.height=height;
    }
}

 이 코드를 보면 지금까지 보던 코드와는 약간 다르다. 같은 이름의 생성자가 여러 개 있는 것을 확인할 수 있다. 이것이 생성자 오버로딩이다. 그럼 코드를 세세히 살펴보겠다. 우선 1번 생성자부터 확인을 해보겠다.

 

 1번 생성자는 생성자 안에 아무 내용도 없다. 이는 생성자를 선언하지 않고 실행했을 때 컴파일러가 자동으로 추가하는 기본 생성자와 같다. 이렇게 되면 객체 생성 시에는 아무런 값도 초기화되지 않는다.

 

 2번 생성자는 매개 변수로 name만 주어졌다. 이후 안에서는 객체 내의 name 필드를 초기화하고 있다. 그리고 다른 필드 age와 height;는 초기화하지 않고 있다.

 

 3번 생성자는 위와 같은 방식으로 name과 age만 초기화한다.

 

 4번 생성자는 클래스 내의 모든 필드를 초기화하고 있다

 

 이처럼 생성자 오버로딩은 자신이 원하는 값만 초기화하고자 할 때 사용할 수 있다. 그런데 위에서 보면 코드가 중복되는 줄이 너무 많고 좀 복잡해보인다. 이럴 때 사용하는 것이 this() 메소드이다. 이 메소드는 같은 클래스 내의 다른 생성자를 호출할 때 사용된다. 쉽게 말하면 지금 속해있는 생성자 안에서 같은 매개 변수를 갖고 있는 형식의 생성자를 호출한다는 말과 같다. 그러면 아래의 수정된 코드를 살펴보겠다.

※ 이때 주의해야 할 점은 this() 메소드는 반드시 생성자의 첫줄에서만 허용된다.

public class Person {
	String name;
    int age;
    int height;
    
    Person(){
    }
    
    Person(String name){
    	this.name=name;
    }
    
    Person(String name, int age){
    	this(name);
        this.age=age;
    }
    
    Person(String name, int age, int height){
    	this(name,age);
        this.height=height;
    }
}

 위의 코드를 보면 훨씬 간결하고 중복되는 내용도 줄어든 것을 확인할 수 있다. 그러면 이렇게 클래스를 생성하고 어떻게 객체를 생성하는지에 대해 알아보도록 하겠다.

Person me=new Person();
Person friend1=new Person("Park");
Person friend2=new Person("Kim", 20);
Person friend3=new Person("Choi", 22, 180);

 위처럼 나를 포함한 친구들을 생성해 보았다. 위처럼 생성을 하면 나는 아무런 정보도 초기화되지 않았고 내려갈수록 한개씩 초기화돼서 마지막 친구의 객체의 name은 'Choi', age는 22, height는 180으로 초기화된 것을 확인할 수 있다.

'프로그래밍 > JAVA' 카테고리의 다른 글

return문  (0) 2021.04.30
메소드 - Method  (0) 2021.04.30
this  (0) 2021.04.30
생성자  (0) 2021.04.30
클래스의 구성 요소  (0) 2021.04.29

+ Recent posts