국비교육

국비지원 57일차(JAVA - 변수, 메서드)

재밌는개발러 2023. 10. 14. 12:00

※JAVA - 변수, 메서드

    1. 변수

      1) 변수 종류: 종류를 결정하는 조건은 변수의 선언된 위치 / static 키워드
            - 클래스 변수 (cv)

                다른 클래스의 메서드에서도 사용가능하다 ex) A 클래스의 static 변수 선언했으면 B클래스의 메서드에서도 A 클                  래스 static 변수 사용가능하다.
                클래스 영역에 있으면서 static 붙은 거
                클래스가 메모리에 올라갈 때 생성
                모든 인스턴스가 공통된 저장공간(변수)을 공유하기 때문에 공통적인 값을 유지해야 하는 경우 클래스 변수로                    선언한다.
                사용 시 : 클래스명. 변수명 형식으로 사용한다.

            - 인스턴스 변수(iv)
                클래스 영역에 있는 거
                인스턴스가 생성될 때 생성(heap에 올라갈 때)
                인스턴스가 생성될 때마다 독립적인 저장공간을 갖게 되기 때문에 각각 고유한 값을 가져야 하는 경우 인스턴                         스 변수로 선언한다.

            - 지역 변수(lv)
                클래스영역이 아닌(메서드, 생성자) 영역에 있는 변수 뜻함
                {}와 같은 스코프 영역 안에 있는 거

 

    2. 메서드 (자바에서 중요한 개념 중에 하나)

      -> 특정 작업을 수행하는 코드를 하나로 묶어놓은 것.

       1) 장점: 높은 재사용성
            중복코드 제거

        2) 선언방법
            메서드는 '선언부'와 '구현부'로 구성된다.
            '선언부': [접근제어자] [static] 리턴타입 메서드이름([매개변수]) -> [] 안에 있는 것은 생략가능한 것.
                    리턴타입, 메서드이름 은 필수
                    *리턴 안 하는 메서드면 리턴타입은 void로 하면 됨.
                    *리턴하는 메서드면 리턴하려는 자료형에 맞춰서 리턴타입 명시하면 된다.
 
            '구현부': {실행문}

         *  가장 많이 작성하는 메인메서드를 보면 public static void main(String [] args)로 되어 있는데
            public - 접근제어자
            void - 리턴타입(리턴 없다는 뜻)
            main - 이름(메서드 이름은 소문자로만 쓰기)

 

※JAVA - 변수, 메서드 예제 1

public class Ex17_1_변수와메서드 {
String ttt(){
    return " ";
}

public static void main(String[] args) {

    System.out.println("홍길동씨 " + AA.str); //홍길동씨 헬로
    //AA에 str 클래스변수는 static이기떄문에 따로 new안해도 사용가능하다.


    AA a = new AA();
    System.out.println(a.num1); //100
    System.out.println(AA.str); // 헬로
    a.tmp(); //바이

    BB b = new BB();
    b.tmp(); // 헬로 누구씨
}

} //Ex17_1_변수와메서드 메인클래스 끝나는부분

//AA라는 외부클래스
class AA {
    static String str = "헬로"; // 클래스변수
    int num1 = 100; // 인스턴스 변수


    void tmp() {
        int num2 = 200;
        System.out.println(BB.str2);
    }
}
//BB라는 외부클래스
class BB {
    static String str2 ="바이";
    void tmp() {
        System.out.println(AA.str + " 누구씨");
    }
}

1) static String str = "헬로"

    static String str2 ="바이"

-> 이렇게 static으로 선언한 클래스 변수들은 해당 프로그램 실행 시 바로 heap메모리에 올라가므로

   new 인스턴스화 없이 사용할 수 있다. 

-> 그리고 다른 클래스에도 사용가능합니다.

class AA {
// BB클래스의 static 변수인 str2를 가져와 사용한것이다.
    void tmp() {
        int num2 = 200;
        System.out.println(BB.str2);
    }
}

 

 

2) class AA {
    int num1 = 100; 
    void tmp() {
        int num2 = 200;
        System.out.println(BB.str2);
    }
}

-> 이렇게 외부클래스에 static 하지 않은 변수나 메서드들은 다른 클래스에서 사용하려면 new 인스턴스화해서 그 객체에 변수, 메서드들을 불러와서 사용할 수 있다.

public static void main(String[] args) {
    AA a = new AA();
    System.out.println(a.num1);
    a.tmp();
   }

 

※JAVA - 변수, 메서드 예제 2

-> 결괏값이  아래처럼 나오게 하려고 한다.

main 시작

Method1 시작

Method2 시작

Method2 끝

Method1 끝

main 끝

 

1. 만약 method1 이 static 메서드 라면

public class Ex17_2_static메서드와_인스턴스메서드 {
    public static void main(String[] args) {
        Ex17_2_static메서드와_인스턴스메서드 sc =new Ex17_2_static메서드와_인스턴스메서드();
     
        System.out.println("main 시작");
        Method1(); //1) main시작 출력후 Method1() 호출해서 Method1()로 이동한다.
        System.out.println("main 끝"); //5) main 끝 출력해준다.
    }
    static void  Method1(){
        System.out.println("Method1 시작");
        Method2(); //2) Method1 시작 출력하고 Method2() 호출해서 Method2()로 이동한다.

        System.out.println("Method1 끝"); 
        //4) Method1 끝 출력해주고 void main에서Method1(); 호출했던부분으로 돌아가서 그다음
        //출력문인 main 끝 을출력한다.

    }
    void Method2(){
    	//3) Method2 시작, Method2 끝 출력이끝나면 다시 Method1()에 Method2()호출했던부분으로 
        //돌아가서 그다음 Method1 끝 을 출력해준다.
        System.out.println("Method2 시작");
        System.out.println("Method2 끝");
        
    }
}

 

2. 만약 method1 이 static 메서드가 아니라면

public class Ex17_2_static메서드와_인스턴스메서드 {
    public static void main(String[] args) {
        Ex17_2_static메서드와_인스턴스메서드 sc =new Ex17_2_static메서드와_인스턴스메서드();
        System.out.println("main 시작");
        sc.Method1();
        System.out.println("main 끝");
    }

    /*static*/ void  Method1(){
        System.out.println("Method1 시작");
        Method2();
        System.out.println("Method1 끝");

    }
    void Method2(){
        System.out.println("Method2 시작");
        System.out.println("Method2 끝");
        
    }
}

 

1) method1이  static 메서드가  아니라면 static 한 main메서드에서 쓰기 위해서는 해당클래스에서 new인스턴스 객체를 만들어서  그 객체 안에 Method1() 메서드를 불러와 사용할 수 있을 것이다.

-> static 한 main메서드 프로그램 실행 시 heap메모리에 생성이 된다. 그리고 static 메서드가 아닌 method1 은 heap 메모리에 생성된 게 아니라 해당클래스 영역 안에 있을 것이다.

-> 그래서 static 메서드가 아닌 method1을

public static void main(String[] args) {
 // method1 를 가지고 있는 클래스를 인스턴스화 시키면됨.
        Ex17_2_static메서드와_인스턴스메서드 sc =new Ex17_2_static메서드와_인스턴스메서드();
        System.out.println("main 시작");       
        sc.Method1();
        System.out.println("main 끝");
    }

 

2) static 한 메인 메서드에서 new객체에 method1을 호출해서   method1함수로 이동해서 "  method1 시작 " 출력문을 수행할 것이고 그다음엔 method2를 호출해야 되는데  이때는 따로 method2를 new안 해도 사용할 수 있는 이유가 같은 클래스에 있는 메서드 이기도 하고 같은 메모리 영역 안에 있는 메서드이므로 따로 new 안 해도 method2를 호출할 수 있는 것이다.

 /*static*/ void  Method1(){
        System.out.println("Method1 시작");
        Method2();

        System.out.println("Method1 끝");

    }