매개변수, 지역변수, 전역변수, 인스턴스변수

KIM YONG GU·2023년 10월 11일
0

JAVA Knowledge

목록 보기
34/40
post-custom-banner

전역변수(클래스 변수), 인스턴스 변수, 지역변수, 매개변수는 변수의 범위와 사용 범위에 대한 중요한 차이점이 있습니다. 아래에서 각각을 비교합니다.

전역변수 (클래스 변수 - Class Variables):

  • 역할: 클래스 내에서 모든 메서드에서 공유되는 변수로, 객체 간에 데이터를 공유하기 위해 사용됩니다.

  • 범위: 클래스 내에서 전역적으로 사용됩니다.

  • 생존 기간: 프로그램이 실행되는 동안 유지되며 프로그램이 종료되기 전까지 소멸하지 않습니다.

public class MyClass {
    public static int globalVar; // 클래스 변수 (전역 변수)
}

인스턴스 변수 (Instance Variables):

  • 역할: 클래스로부터 생성된 객체(instance)마다 별도로 유지되는 변수로, 객체의 상태 정보를 저장합니다.

  • 범위: 객체 내에서 유효하며, 객체 간에 데이터를 공유하지 않습니다.

  • 생존 기간: 객체가 생성되고 메모리에서 해제될 때까지 유지됩니다.

public class Person {
    public String name; // 인스턴스 변수
    public int age; // 인스턴스 변수
}

지역변수 (Local Variables):

  • 역할: 메서드 내에서 선언된 변수로, 임시 데이터 저장 및 계산에 사용됩니다.

  • 범위: 선언된 블록 또는 메서드 내에서만 유효합니다.

  • 생존 기간: 선언된 블록 또는 메서드 실행 중에만 유효하며 메서드나 블록을 벗어나면 소멸합니다.

public void calculateSum() {
    int a = 5; // a는 지역 변수
    int b = 10; // b는 지역 변수
    int sum = a + b; // sum은 지역 변수
}

매개변수 (Parameters):

  • 역할: 메서드에 전달되는 값을 저장하기 위한 변수로, 메서드 호출 시 인수(argument)를 받아 메서드에 전달합니다.

  • 범위: 메서드 내에서만 유효하며, 메서드의 인자로 사용됩니다.

  • 생존 기간: 메서드 실행 동안 유효하며 메서드 실행이 끝나면 소멸합니다.

public void printMessage(String message) {
    System.out.println(message);
}

인스턴수 변수의 잘못된 사용 예시 (텍스트 게시판에서 세션 문제점 해결)

public class MemberController {

    MemberDao memberDao = new MemberDao();

    Scanner scan = new Scanner(System.in);

    Member sessioninfo = null; // sessioninfo를 멤버 변수로 선언

    public void signup() {

        System.out.println("==== 회원 가입을 진행합니다. ====");
        System.out.print("이름을 입력해주세요 : ");
        String inputName = scan.nextLine();
        System.out.print("아이디를 입력해주세요 : ");
        String inputId = scan.nextLine();
        System.out.print("비밀번호를 입력해주세요 : ");
        String inputPass = scan.nextLine();
        System.out.print("닉네임을 입력해주세요 : ");
        String inputNick = scan.nextLine();

        memberDao.signup(inputName, inputId, inputPass, inputNick);;
    }

    public Member login() {
        System.out.println("==== 로그인을 진행합니다. ====");
        System.out.print("아이디 : ");
        String loginId = scan.nextLine();
        System.out.print("비밀번호 : ");
        String loginPass = scan.nextLine();

        Member sessioninfo = memberDao.signin(loginId, loginPass);

        return sessioninfo;
    }

    public Member loginedMember() {
        return sessioninfo;
    }
}

login 메서드 내부의 Member sessioninfo는 지역변수로서 return되어 MemberController 내부에서 사용될 수 없다. 인스턴스 변수 Member sessioninfo와, 지역변수 Member sessioninfo는 전혀 다른 사이클 주기를 가지고 있다.

이는 올바른 관찰입니다. login 메서드 내부에서 선언된 Member sessioninfo는 해당 메서드의 지역변수로서, 메서드가 실행될 때 생성되고 메서드 종료 시에 사라집니다. 이 지역변수와 멤버 변수인 Member sessioninfo는 서로 다른 변수입니다. 따라서 login 메서드 내부에서 선언된 sessioninfo는 해당 메서드에서만 사용 가능하며, 메서드가 종료될 때 메모리에서 해제됩니다.

로그인 메서드 내부의 sessioninfo와 인스턴스 변수 sessioninfo는 서로 다른 범위와 수명을 가지며 전혀 다른 변수입니다. 인스턴스 변수 sessioninfo는 해당 클래스의 모든 메서드에서 사용 가능하며 객체의 수명과 함께 존재하는 반면, 지역변수 sessioninfo는 메서드 내에서만 사용 가능하고 메서드의 수행 주기와 관련이 있습니다.

따라서 login 메서드에서 sessioninfo를 채우고 반환하려면, 인스턴스 변수 sessioninfo에 접근하여 값을 설정해야 합니다. 이렇게 하면 sessioninfo가 멤버 변수로 저장되며, loginedMember 메서드나 다른 메서드에서 사용할 수 있습니다.

profile
Engineer, Look Beyond the Code.
post-custom-banner

0개의 댓글