※[컬러잇 자바] 시리즈는 "왜?"라는 질문을 중심으로 자바의 기초문법에서 고급 자바기술까지 알아보는 컬러잇 개발블로그 시리즈입니다.
https://color-it.tistory.com/3
[컬러잇자바] #3. 왜 변수와 타입을 사용할까?
※[컬러잇 자바] 시리즈는 "왜?"라는 질문을 중심으로 자바의 기초문법에서 고급 자바기술까지 알아보는 컬러잇 개발블로그 시리즈입니다. https://color-it.tistory.com/2 [컬러잇 자바] #2. 왜 객체를 사
color-it.tistory.com
컬러잇 자바시리즈 4편. 저번시간에는 객체를 이루는 첫 번째 요소인 변수에 대해서 알아보았습니다. 이번에는 객체를 이루는 두 번째 요소인 메서드에 대해서 알아보겠습니다.
오늘은 자바 내에서 메서드의 기능과 메서드를 이루고 있는 요소들, 그리고 메서드의 특징에 대해서 알아보겠습니다.
메서드는 객체 중에서 객체가 할 수 있는 일에 해당합니다. 계산기 객체라면 더하기, 빼기 등의 사칙연산이, 개 객체라면 짖기, 사람 객체라면 걷기 등이 이에 해당합니다.
그럼 메서드는 어떻게 사용해야할까요? 이제부터 알아보도록 하겠습니다.
메서드는 어떻게 선언할까?
반환타입 메서드명(매개변수) {
...코드...
return xx;
}
메서드는 반환타입, 메서드이름, 매개변수, 반환값으로 이루어져있습니다. 이중에서 메서드이름과 매개변수들을 메서드 시그니처라고 일컫습니다.
많은 자바 교재에서 메서드를 수학의 함수와 비슷하다고 합니다. 수학의 함수는 특정 값을 받아서 그 값을 기반으로 계산한 후 계산된 값을 반환합니다.
메서드도 마찬가지입니다. 특정한 값을 받아서(매개변수), 그 값을 토대로 연산을 한 후 연산된 값을 반환합니다. (반환값) 약간 다른 점은 매개변수가 없어도되고, 반환값이 없어도됩니다. 이제부터 하나씩 알아보도록 하겠습니다.
1. 반환타입
위에서 말했듯이 메서드는 수학의 함수처럼 특정값을 반환하는 경우가 있습니다. 예를들면, 더하기 메서드에서는 더한 값을 반환해야합니다. 랜덤이름생성기 메서드라면 랜덤으로 생성된 이름을 반환해야하고요. 수학에서의 함수와 비슷합니다.
메서드가 특정값을 반환해야할 때, 메서드의 선언부에 어떤 타입의 값을 반환할지 미리 명시해야합니다. 메서드가 최종적으로 숫자를 반환하면 int, 문자열을 반환하면 String이 되겠죠. 저번에 변수시간에 배운 변수의 타입과 같습니다. 그리고 메서드가 마지막으로 반환하는 값이 여기에 명시된 타입과 일치해야합니다.
그런데, 짖기나 걷기, 때로는 단순히 클래스의 변수를 바꾸는 일 등에서는 굳이 반환값이 필요하지 않은 경우가 있습니다. 이런 경우에는 반환값을 지정하지 않고, 반환타입을 void로 지정합니다.
2. 매개변수
수학에서 함수는 "특정값을 받아 계산한 후 계산된 값을 반환한다"라고 했습니다. 자바의 메서드도 특정 값을 받아서 계산을 수행할 수 있습니다.
int add(int x, int y) {
return x + y;
}
대표적인 예시가 계산기 클래스에서 더하기 메서드를 만들때, 매개변수로 값을 받아서 덧셈을 진행한 후에 반환하죠. 반환타입이 int이고, 매개변수로 x와 y를 받아서, 더한값을 반환하는 add 라는 이름을 가진 메서드입니다.
수학에서 함수가 여러 변수들을 받을 수 있듯이, 메서드도 매개변수를 여러 개 받을 수 있습니다.
3. 반환값 (리턴값)
int add(int x, int y) {
return x + y;
}
앞서 말했다시피, 메서드들은 메서드 코드를 실행시킨 후 특정값을 반환해야하는 경우가 있습니다. 반환"은 return 키워드를 사용합니다. 위에서 보면 최종연산이 끝나고 최종적으로 반환되는 값이 x + y 라는 int형 값입니다.
중요한 점은 메서드 선언에서의 매개변수 부분은 "선언"에 해당한다는 것입니다. 메서드만 따로 두고 보면 어떤 값이 매개변수로 전해질 지 알 수 없습니다.
int add(x, y) {
int adding = x + y;
return adding;
}
위 코드처럼 매개변수의 타입을 지정해주지 않으면 에러가 발생합니다. 코드를 실행시키거나 add 메서드를 사용하는 시점에서는 x와 y의 타입을 예측할 수 있겠지만, 메서드를 선언하는 시점에서는 알 수 없기 때문이죠.
몇 가지 경우를 더 살표볼까요?
class Dog {
int age;
String name;
void changeAge() {
age = age + 1;
}
}
이번에는 클래스 내부에 정의된 메서드입니다. 개 객체의 나이 변수를 1씩 증가시키는 메서드입니다. 메서드의 이름은 changeAge이고, 매개변수는 없습니다.
비록 메서드에게 전해준 값이 하나도 없지만, 이 메서드는 클래스의 변수의 값을 바꾸는 기능을 수행합니다. 이처럼 메서드는 매개변수를 받아서 연산을 수행하고 값을 반환하는, 마치 수학의 함수와도 비슷한 역할을 수행할 때도 있지만, 위처럼 단순히 다른 메서드를 사용하거나, 객체 변수의 값을 수정하거나하는 역할도 담당합니다.
메서드는 어떻게 사용할까?
사실 위의 내용은 메서드의 선언에 해당합니다. 단순히 자바 프로그램에게 "이 클래스에서 만들어진 객체들은 이 메서드를 사용할 수 있다"라고만 알려두는 것이죠. 실제로 메서드를 실행시켜서 변수를 바꾸거나, 연산을 수행하려면 모두 메서드를 사용해야합니다.
그렇다면 메서드는 어떻게 사용할까요?
class Person {
Dog mydog = new Dog(); //이 부분은 생성자에 해당합니다.
//나중에 다룰 예정이기에 간단히 설명하자면 new 연산자를 통해 객체를 "생성"합니다.
//new 연산자가 없다면 객체가 생성되지 않습니다.
void setMyDogInformation() {//이 부분은 메서드로 다음시간에 할 예정입니다!
mydog.age = 3;
mydog.weight = 3.3;
}
}
저번에 참조형 변수에 대해서 다룰 때 객체의 변수에 접근하려면 (참조형 변수명).(객체 내에서 접근하려는 변수명)을 통해 변수에 접근해야합니다. 메서드도 마찬가지입니다.
class Person {
Dog myDog = new Dog();
}
class Dog {
int age;
int showDogAge() {
return age
}
}
저번 변수 시간에 도움을 준 개와 개의 주인 클래스가 있습니다. 개 객체에는 나이를 알려주는 showDogAge라는 메서드가 있네요.
만약 개의 주인이 개의 나이를 알고 싶다면 Dog 객체의 참조형 변수인 myDog 변수를 통해 showDogAge 메서드를 사용해야합니다. 이 과정을 메서드를 호출한다라고 합니다. 그냥 Dog.showDogAge라고하면 일반적인 상황에서는 오류가 발생합니다. 변수와 마찬가지로 메서드들은 일반적인 경우라면 반드시 변수를 통해서 접근해야합니다. (static이라는 예외가 있습니다만 이곳에서 다루지는 않습니다. 조만간 다룰 예정입니다.)
메서드가 호출되면 그 메서드가 실행됩니다. showDogAge 메서드는 간단히 나이만 반환하는 함수로 int형의 age 변수의 값이 반환됩니다. (그래서 반환값입니다.) 그럼 이 메서드를 호출한 쪽에서는 어떻게 이를 사용할까요?
class Person{
Dog mydog = new Dog();
int dogAge = mydog.showDogAge();
}
이렇게 변수에 값을 저장할 수 있습니다. 메서드를 호출하면 변수가 가리키는 객체에 접근하고, 그 객체의 메서드에 접근해서 실행한 다음 최종 반환된 값을 변수가 가지게 됩니다.
class Person{
Dog mydog = new Dog();
int dogAge = mydog.showDogAge() + 3;
}
그래서 메서드를 호출한 값에 추가적으로 연산을 수행할 수 있습니다. 왜냐하면 메서드 호출의 최종 결과값은 메서드의 반환값이기 때문이죠. 위의 예시에서 dogAge 변수는 개의 나이에 3을 더한 값을 가지게될 것입니다.
이처럼 매개변수를 호출하면 호출에 대한 결과값은 메서드의 반환값이기 때문에, 메서드 호출을 값처럼 생각해서 연산을 추가적으로 수행할 수 있습니다. 물론 일반변수와 같이 타입도 맞춰야하고, 반환값이 없는 void 메서드의 경우에는 반환값이 없어 변수에 값을 저장하거나 연산을 수행할 수 없습니다.
위의 예시는 매개변수 없이 객체의 변수에 접근한 예시이고, 몇 가지 경우를 더 들어보겠습니다.
class Calculator {
int add (int x, int y) {
return x + y;
}
int minus (int x, int y) {
return x - y;
}
}
위에서 잠깐 나왔던 add 메서드와 minus 메서드입니다. 매개변수를 사용한 메서드의 대표적인 예시입니다.
...클래스 선언...
...메서드 선언...
Calculator c = new Calculator(); //여기는 생성자입니다. 다음시간에 다룹니다.
int result = c.add(3, 5); //8
int result2 = c.minus(3,5); //-2
...메서드 종료...
...클래스 종료...
매개변수를 사용하는 메서드도 일반 메서드처럼 호출하면 됩니다. 다만 메서드에 선언된 매개변수의 타입과 개수에 맞게 값을 넣어주어야합니다.
...클래스 선언...
...메서드 선언...
Calculator c = new Calculator(); //여기는 생성자입니다. 다음시간에 다룹니다.
int result = c.add(3, 5); //8
int result2 = c.minus(result,5); //3
...메서드 종료...
...클래스 종료...
역시 매개변수는 "값"으로 처리하기 때문에 값을 담당하는 변수를 넣어도되고,
...클래스 선언...
...메서드 선언...
Calculator c = new Calculator(); //여기는 생성자입니다. 다음시간에 다룹니다.
int result = c.add(3, 5); //8
int result2 = c.minus(c.add(7,2),5); //4
...메서드 종료...
...클래스 종료...
이렇게 메서드를 호출해도됩니다. 왜냐하면 위에서 말했듯이, 메서드를 호출하면 최종적으로는 "값"이 떨어지기 때문입니다.
한 가지 경우를 더 보겠습니다.
class Dog{
int age;
String name;
void setAge(int age) {
this.age = age;
}
void setName(int name) {
this.name = name;
}
}
메서드는 "객체의 상태를 나타내는 변수를 변화시킨다"고 했습니다. 그럼 매개변수로 원하는 값을 받아서 변수를 변화시켜도 되겠죠? 위의 예시가 바로 그 예시입니다.
개의 나이와 이름을 매개변수로 받아서 개 객체의 상태변수에 저장하는 setAge와 setName 변수입니다.
class Person {
Dog myDog = new Dog(); //이부분은 생성자입니다. 다음시간에 다룹니다.
myDog.setAge(3);
myDog.setName("초코");
}
다른 곳에서 이 메서드를 호출하면 해당 개 객체는 나이가 세 살이고 이름이 초코인 강아지가 되겠죠.
다만 문제가 있습니다. 매개변수의 이름은 클래스 내부에 선언된 인스턴스 변수와 이름이 같아도 딱히 문제가 없다는 것입니다. 위의 setAge 메서드에서 매개변수 이름과 인스턴스 변수 이름이 age로 같아서 문제가 없다는 뜻입니다.
물론 두 변수의 이름이 같아서 에러가 발생하지는 않지만 개발자가 볼 때 실수할 가능성이 높습니다. 구분할 수 없기 때문이죠. 따라서 이 두 변수를 구분하기 위해 this 키워드를 사용합니다.
this는 객체가 자기자신을 나타내도록 미리 선언된 변수입니다. 따라서 this.age라고하면 객체 자기자신의 인스턴스 변수 age를 나타내는 것이죠. 이렇게 this 키워드를 사용하면 두 변수를 분류할 수 있습니다.
class Dog{
int age;
String name;
void setAgeAndName(int age, String name) {
setAge(age);
setName(name);
}
void setAge(int age) {
this.age = age;
}
void setName(String name) {
this.name = name;
}
}
마지막으로 같은 클래스에 속한 메서드들끼리도 서로 호출할 수 있습니다. 이 때는 그냥 메서드 이름만 적어준다면 바로 자기 자신의 클래스에 속한 메서드를 호출합니다.
메서드는 왜 사용할까?
객체의 상태를 바꾸기 위해서
class Dog {
int age;
String name;
void changeAge() {
age = age + 1;
}
}
위에서 봤던 changeName 메서드가 탄생한 이유입니다. 우리가 나이를 먹고, 몸무게나 키가 변하듯이 객체의 상태도 가변적입니다.
이 때 객체의 상태를 변화시키기 위해서 메서드가 사용됩니다.
저번 시간에 알아보았던 참조형 변수를 통해서 객체 상태를 변화시키는 것이 바로 이 메서드 안에서 일어납니다. 자바와 같이 객체를 사용하는 언어들에서 메서드를 사용하느 이유이기도합니다.
코드를 재사용하기 위해서
사실 객체라는 개념이 등장하기 전부터 메서드라는 것은 존재했습니다. 메서드가 처음 생겨날 때부터 메서드가 클래스의 구성요소고 될 때까지 메서드를 사용하는 가장 큰 이유이자 전통적인 이유는 코드를 재사용하기 위해서입니다.
간단한 예시를 살펴볼까요?
개발 일을 하던 컬러잇은 우연히 인터넷 카페를 개발하게 되었습니다. 인터넷 카페 개발 업무는 순조롭게 진행되었고, 이젠 관리자 전용 기능만 개발해야했습니다.
class User {
String rank;
String username;
...
}
모든 유저 객체에게는 rank라는 변수가 있어서 이 변수를 확인하면됩니다. 즉, 관리자 기능을 실행시키려고하면 해당 유저의 rank 변수를 확인해서 유저의 권한을 확인하면 됩니다.
if (rank == "ADMIN") {
//관리자 기능 허가
//활동정지, 게시글 삭제 등 운영진 기능 추가
} else {
//권한없음 오류 발생
}
그래서 이 간단한 if 문을 모든 관리자 기능을 담당하는 코드에 붙여넣기했습니다. 가령 회원 활동 정지나 게시글 삭제 기능에 저 코드를 붙여넣기하는 등으로 말이죠. 관리자 기능이 꽤 많아서 붙여넣기를 100번 정도했지만, 개발은 완벽하게 끝났습니다.
그런데 어느날 상부에서 지시가 내려왔습니다.
"우리 이번에 개발방향이 조금 바뀌었거든? 인터넷카페의 VIP 회원도 관리자 기능을 수행할 수 있게 하기로 했어"
라고하면 붙여넣기한 100곳에 가서 원래 코드를
if (rank == "ADMIN" || rank == "VIP") {
//매개변수 안의 내용은 나중에 다룹니다.
//지금은 OR을 의미한다고 보면 됩니다.
//관리자 기능 허가
//활동정지, 게시글 삭제 등 운영진 기능 추가
} else {
//권한없음 오류 발생
}
이 코드로 바꿔야겠죠. 언젠가는 되겠지만, 아주 귀찮을 일입니다.
boolean checkUserRole(String rank){
if (rank == "ADMIN") {
return true;
} else {
return false;
}
}
하지만 메서드를 사용했다면 이렇게 메서드만 구현한 다음에 원하는 곳에서 위 메서드를 호출하면 됩니다.
위 메서드는 유저의 랭크를 받아서 관리자일 경우 true, 아닐 경우 false를 반환하는, boolean 반환타입의 checkUserRole 메서드입니다.
100곳에서든, 1000곳에서는, 1억 곳에서든 단순히 메서드 호출만하면 됩니다. 반대로 메서드를 사용하지 않으면 붙여넣기를 1억 개를 해야하고, 수정사항이 생기면 1억 번 고쳐야하겠죠. 여간 귀찮은 일이 아닙니다.
이것이 객체가 등장하기 이전에, 메서드를 사용했던 가장 큰 이유입니다. 코드 중복을 줄이고, 코드의 안정성을 높이기 위해서입니다.
이렇게 오늘은 클래스를 이루는 두 번째 요소, 메서드에 대해서 알아보았습니다. 이렇게 클래스를 이루는 모든 요소에 대해서 다뤄봤네요.
하지만 아직은 아리송한 부분이 많을 수 있습니다. 그래서 우리는 객체를 마무리짓기 위해서 다시 클래스에 대해서 다뤄보려 합니다. 처음 클래스를 봤을 때와 달리 메서드와 변수에 대해서 배운 후에 다시 클래스를 바라보면 또 새롭게 느껴질 것입니다. 설명할 수 있는 것도 더 많아지고요.
따라서 다음에는 변수와 메서드에 기반해 클래스에 대해 알아보고, 자바의 "객체 간의 상호작용"을 본격적으로 알아보면서, 간단한 예제들을 통해 변수와 메서드가 어떻게 사용되는지 알 수 있도록 글을 진행할 예정입니다. 이 과정이 끝나면 이 시리즈의 독자들은 자유롭게 객체를 호출하고, 메서드도 호출하고, 자바 프로그래머로 나갈 수 있는 기본을 다지게된 것입니다.
잠깐!
그 전에 중요한 것이 있습니다.
지금까지 배운 것은 단지 "난 이 변수가 객체를 가리키게 할 거야"라고 선언한 것이지, 실제로 객체가 만들어져서 객체 내부에 참조값이 저장되지는 않았다는 것입니다.
따라서 다음시간, 컬러잇자바 5편에서는 객체를 생성하는 방법, 생성자에 대해서 알아보겠습니다. 감사합니다!
'Language > ColorIt_Java' 카테고리의 다른 글
| [컬러잇자바] #6. 왜 main 메서드를 사용할까? (0) | 2026.02.02 |
|---|---|
| [컬러잇자바] #5. 왜 생성자를 사용할까? (0) | 2026.01.26 |
| [컬러잇자바] #3. 왜 변수와 타입을 사용할까? (1) | 2026.01.12 |
| [컬러잇 자바] #2. 왜 객체를 사용할까? (1) | 2026.01.05 |
| [컬러잇 자바] #1. 왜 자바를 배워야할까? (0) | 2025.12.29 |
