안녕하세요! 쏘코입니다.

 

오늘은 메소드를 배우면서 무턱대고 사용했던 Public과 Static에 대해서 간단하게 알아보도록 하겠습니다.

(객체 지향을 모르는 지금 단계에서는 이해가 어려운 것이 당연하니 이해가 안되면 이 부분은 우선 넘어가시면 됩니다!!)

 

목차


    0. 접근제한자(Access Level Modifiers)

    AccessLevelModifiersMethod라는 클래스를 하나 만들어줍니다. (이름이 좀 기네요 ^^;;)

    그리고 Hi라는 String을 출력하는 hi라는 메소드를 하나 만들고 main 메소드 안에서 사용합니다.

     

     

    여기까지는 우리가 했었던 내용이죠?

    이제 접근제한자를 바꿔보겠습니다.

    접근제한자는 클래스끼리의 관계를 설정해주는 장치public, protected, default, private가 있습니다.

    그 중에서도 대표적으로 public, private를 많이 사용합니다.

    그렇다면 private를 사용해볼까요?

     

    hi라는 메소드의 public을 private로 바꿔주고 실행합니다.

    그대로 잘 실행됩니다.

    같은 클래스 내에서 메소드를 사용할 때는 접근제한자가 어떤 것이냐에 관계가 없습니다.

     

    이제 새로운 클래스를 같은 파일 상단에 만들어줍니다.

    Greeting이라는 클래스를 만들고, 그 아래에 private으로 바꿔준 hi를 옮겨줍니다.

    그리고 아래 AccessLevelModifiersMethod 내부의 main함수에서 hi를 사용하기 위해서 Greeting.hi()를 입력하고 실행하면?

    hi에 빨간 밑줄이 뜨면서 실행이 되지 않습니다.

     

    같은 클래스 내부에서는 private 메소드를 사용할 수 있지만, 다른 클래스 내부에서는 사용할 수 없다는 것이 가장 중요한 사실입니다.

    protected, default도 각각의 의미가 있지만, 지금은 public, private만 사용해도 충분합니다.

     

    소프트웨어가 복잡해지면 그것을 정교하게 관리하기 위해서 외부에서 접근할 수 있는 레벨을 지정하는 이러한 기능들이 필요해지게 됩니다.

    이 부분은 객체 지향 프로그래밍(OOP)를 다루면서 그 필요성을 깨닫게 되실 겁니다!!

     

    class Greeting{
    	public static void hi() {
    		System.out.println("Hi");
    	}
    }
    
    public class AccessLevelModifiersMethod {
    	// public, protected, default(생략), private
    	
    	
    	public static void main(String[] args) {
    		Greeting.hi();
    
    	}
    
    }

     


    1. Static

    다시 말씀드리지만 객체 지향을 모르는 상태로 static이 무엇인지 이해하는 것은 굉장히 어렵습니다.

    이해가 가지 않더라도 천천히 이해해 보시거나, 나중에 보시면 되겠습니다.

     

    정의부터 알고 들어가겠습니다.

    잘 모르겠어도 두 번 읽고 가겠습니다.

     

    static이라는 키워드가 붙은 메소드클래스의 메소드입니다.

    static이라는 키워드가 붙지 않은 메소드인스턴스의 메소드입니다.

     

    위 내용을 이해하기 위해 실제로 코드를 만들어봅시다.

    staticMethod라는 클래스를 만듭니다.

     

    그리고 아래와 같이 a와 b라는 메소드를 만들어줍니다.

    잘 작동하죠?!

     

    이제 우리가 만든 메소드들을 Print라는 새로운 클래스에 넣습니다.

    그리고 a와 b 메소드를 Print에 그대로 복사해서 넣어주고

    main에서 사용할 때는 Print.a, Print.b와 같은 형식으로 사용해줍니다.

    이렇게 만들어도 잘 작동하는 모습이죠!

     

     

    이제부터는 조금 어렵습니다.

    지금까지 만들었던 메소드도 충분히 효율적으로 쓸 수 있지만,

    매번 delimiter를 매개변수로 작성해야합니다.

    만약 1억 개의 코드가 있는 경우 매개변수를 1억 번 작성해야 하는 것이죠.

    공통된 delimiter를 한 번 설정해 두고 a 메소드에서도 쓰고 b 메소드에서도 쓰고 싶다면 어떻게 하면 좋을까요?

    Print라는 클래스 내부에서 사용하는 delimiter라는 변수를 만들어두고, 그 곳에 한 번만 저장해뒀다가 쓰고 싶을 때마다 꺼내쓰면 되겠죠?

     

    이걸 위해서는 인스턴스를 만들어야 합니다.

    new를 사용해서 t1이라는 Print의 인스턴스를 만들어줍시다.

    그리고 t1의 delimiter라는 변수에 "-"를 넣어두고 t1의 a, b 메소드를 각각 사용하면 보다 편하게 사용할 수 있겠죠?

    t2라는 새로운 Print의 인스턴스를 만들어서 이 작업을 반복합니다.

    각 인스턴스는 다른 값을 가질 수 있으므로, 인스턴스마다 delimiter가 다르게 저장될 수 있겠죠?

     

    그리고 우리는 인스턴스를 사용했기 때문에 a와 b 메소드에서 static을 빼야 합니다.

    (인스턴스의 메소드는 static이 없다고 했죠?)

    그런데 이렇게 static을 빼면 우리는 이전처럼 Print.a(), Print.b() 형식을 사용할 수 없게 됩니다.

    클래스의 메소드로서 a와 b를 사용하기 위해서는 static이 있어야 하는데, 우리가 static을 뺐기 때문입니다.

     

    인스턴스의 메소드는 매우 잘 작동!!

     

    만약 클래스의 메소드로 사용하고 싶다면 static을 붙인 새로운 메소드를 만들어주면 됩니다.

    이 형식은 이미 익숙하기 때문에 쉽게 이해하실 수 있을 것입니다!

    이렇게 만들면 Print.c("-"); 같은 방식으로 사용할 수 있겠죠!

     

    class Print{
    	public String delimiter; // t1의 delimiter의 값이 "-"가 되면 이 delimiter도 "-"가 된다
    	
    	public void a() { // 메소드가 인스턴스의 소속일 때에는 static을 빼 줘야 한다!
    		System.out.println(this.delimiter);
    		System.out.println("a");
    		System.out.println("a");
    	}
    
    	public void b() { // 메소드가 인스턴스의 소속일 때에는 static을 빼 줘야 한다!
    		System.out.println(this.delimiter);
    		System.out.println("b");
    		System.out.println("b");
    	}
    	
    	public static void c(String delimiter) {
    		System.out.println(delimiter);
    		System.out.println("b");
    		System.out.println("b");
    	}
    }
    
    public class staticMethod {
    
    	public static void main(String[] args) {
    //		Print.a("-"); // Print라는 클래스의 소속으로 실행중
    //		Print.b("-");
    		
    		// instance
    		Print t1 = new Print(); // t1은 Print의 분신(instance)
    		t1.delimiter = "-"; // t1이라는 인스턴스의 소속으로 실행중
    		t1.a();
    		t1.b();
    		
    //		Print.a("*");
    //		Print.b("*");
    		
    		Print t2 = new Print(); // t2은 Print의 분신(instance)
    		t2.delimiter = "*";
    		t2.a();
    		t2.b();
    	}
    
    
    }

     


    정말 어려운 내용을 소화해내시느라 고생 많으셨습니다.

    이해가 되지 않으셨다해도 무방합니다.

    지금은 그냥 쓱 보고 이런게 있구나 하고 넘어가시면 되고,

    계속 공부하다보면 자연스럽게 궁금해지고 이해가 되는 순간이 올 것입니다.

     

    그렇다면 다음 포스팅부터는 객체 지향을 본격적으로 다뤄보도록 하겠습니다!

    오늘도 읽어주셔서 감사합니다 😄😄

    반응형
    • 네이버 블로그 공유하기
    • 네이버 밴드에 공유하기
    • 페이스북 공유하기
    • 카카오스토리 공유하기