목록으로

[자바 기초] 9강. 객체의 행동: 메소드(Method)와 변수의 생존 범위(Scope)

지난 시간 복습과 이번 강의 목표

지난 8강에서 우리는 Student라는 설계도를 만들고, new 키워드로 학생 객체를 생성했습니다. 하지만 지금까지의 코드는 **데이터(이름, 점수)**만 저장할 뿐, **기능(행동)**이 없었습니다.

  • 변수(Field): 객체의 상태 (예: 이름, 나이, 점수)
  • 메소드(Method): 객체의 행동 (예: 걷기, 먹기, 공부하기)

이번 시간에는 클래스 안에 메소드를 만들어서 객체가 스스로 움직이게 만들어보겠습니다. 그리고 변수가 어디서 생겨나고 어디서 죽는지(Scope)도 함께 알아봅니다.


1. 메소드(Method)란? = 자판기

메소드는 수학의 **함수(Function)**와 비슷합니다. 쉽게 **'자판기'**를 생각하면 됩니다.

  1. 입력(매개변수): 동전을 넣는다.
  2. 처리(본문): 내부에서 덜컹거리며 음료를 고른다.
  3. 출력(반환값): 음료수가 툭 나온다.

문법 구조

// 반환타입  메소드이름 (매개변수) {
//     실행할 코드
//     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 패턴에 대해 배워보겠습니다. (드디어 캡슐화가 나옵니다!)

👉 10강 바로가기: 내 데이터는 소중하니까, 접근 제어자와 캡슐화