[자바 기초] 9강. 객체의 행동: 메소드(Method)와 변수의 생존 범위(Scope)
지난 시간 복습과 이번 강의 목표
지난 8강에서 우리는 Student라는 설계도를 만들고, new 키워드로 학생 객체를 생성했습니다.
하지만 지금까지의 코드는 **데이터(이름, 점수)**만 저장할 뿐, **기능(행동)**이 없었습니다.
- 변수(Field): 객체의 상태 (예: 이름, 나이, 점수)
- 메소드(Method): 객체의 행동 (예: 걷기, 먹기, 공부하기)
이번 시간에는 클래스 안에 메소드를 만들어서 객체가 스스로 움직이게 만들어보겠습니다. 그리고 변수가 어디서 생겨나고 어디서 죽는지(Scope)도 함께 알아봅니다.
1. 메소드(Method)란? = 자판기
메소드는 수학의 **함수(Function)**와 비슷합니다. 쉽게 **'자판기'**를 생각하면 됩니다.
- 입력(매개변수): 동전을 넣는다.
- 처리(본문): 내부에서 덜컹거리며 음료를 고른다.
- 출력(반환값): 음료수가 툭 나온다.
문법 구조
// 반환타입 메소드이름 (매개변수) {
// 실행할 코드
// return 반환값;
// }
int sum(int a, int b) {
return a + b;
}
2. 실전: 학생에게 능력 부여하기
지난 시간에 만든 Student.java 파일을 열어서 코드를 추가해 봅시다.
학생에게 "자기소개 하기" 능력과 "등급 확인하기" 능력을 줘보겠습니다.
// Student.java
public class Student {
// 1. 필드 (상태)
String name;
int score;
// 2. 메소드 (행동)
// 능력 1: 자기소개 (입력 X, 출력 X)
// void: "결과값이 없다"는 뜻 (일만 하고 끝냄)
void sayHello() {
System.out.println("안녕하세요, 제 이름은 " + name + "입니다.");
System.out.println("제 점수는 " + score + "점입니다.");
}
// 능력 2: 등급 계산 (입력 X, 출력 O)
// String: "일을 끝내고 문자열을 돌려주겠다"는 뜻
String getGrade() {
if (score >= 90) {
return "A"; // 나를 부른 곳으로 "A"를 던져줌
} else {
return "B";
}
}
}
3. 메소드 사용하기 (Main에서 호출)
능력을 만들었으니 써먹어야겠죠? Main.java로 가서 학생에게 일을 시켜봅시다.
// Main.java
public class Main {
public static void main(String[] args) {
// 학생 생성 및 정보 입력
Student s1 = new Student();
s1.name = "철수";
s1.score = 95;
// 1. 메소드 호출 (일 시키기)
System.out.println("--- 자기소개 시작 ---");
s1.sayHello(); // 철수야, 인사해!
// 2. 리턴값이 있는 메소드 호출
// s1.getGrade()가 실행되고 나면 그 자리가 "A"로 변합니다.
String myGrade = s1.getGrade();
System.out.println("--- 등급 확인 ---");
System.out.println(s1.name + "의 학점은: " + myGrade);
}
}
실행 결과
--- 자기소개 시작 ---
안녕하세요, 제 이름은 철수입니다.
제 점수는 95점입니다.
--- 등급 확인 ---
철수의 학점은: A
4. 변수의 생존 범위 (Scope)
초보자가 메소드를 만들 때 가장 많이 겪는 에러인 **"변수를 찾을 수 없습니다(Cannot find symbol)"**의 원인입니다.
변수는 자기가 선언된 중괄호 { } 안에서만 살 수 있습니다.
public class Test {
int a = 10; // [전역 변수] 클래스 전체에서 사용 가능 (집안 공용 물건)
void method1() {
int b = 20; // [지역 변수] method1 안에서만 생존 (내 방 물건)
System.out.println(a); // 가능 (집안 물건이니까)
System.out.println(b); // 가능 (내 방 물건이니까)
}
void method2() {
System.out.println(a); // 가능
// System.out.println(b); // 에러!!! (b는 method1 방에 있음)
}
}
💡 선생님의 비유:
- 인스턴스 변수(필드): 거실에 있는 TV. 가족(메소드) 누구나 쓸 수 있음.
- 지역 변수(매개변수 포함): 내 주머니 속 동전. 나만 쓸 수 있고, 집에 들어가면(메소드 끝나면) 사라짐.
5. 자주 하는 실수 (return 빼먹기)
// 반환 타입을 int라고 약속했는데...
int calc() {
int result = 10 + 20;
// return result; // 이걸 안 쓰면 에러!
}
- void가 아닌 경우: 반드시 마지막에
return 값;이 있어야 합니다. 자판기에 돈 넣었는데 음료 안 나오면 고장이죠?
6. 마무리
이제 여러분의 객체는 데이터도 있고 행동도 하는 완전한 생명체가 되었습니다.
그런데 지금까지는 s1.score = 95; 처럼 누구나 점수를 마음대로 고칠 수 있었습니다.
만약 누군가 실수로 s1.score = -500; 이라고 넣으면 어떡할까요? 시스템이 망가지겠죠?
다음 **[10강]**에서는 외부에서 함부로 내 데이터를 건드리지 못하게 막는 **접근 제어자(private/public)**와, 데이터를 안전하게 다루는 Getter/Setter 패턴에 대해 배워보겠습니다. (드디어 캡슐화가 나옵니다!)