안녕하세요! 쏘코입니다.
오늘은 메소드를 배우면서 무턱대고 사용했던 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();
}
}
정말 어려운 내용을 소화해내시느라 고생 많으셨습니다.
이해가 되지 않으셨다해도 무방합니다.
지금은 그냥 쓱 보고 이런게 있구나 하고 넘어가시면 되고,
계속 공부하다보면 자연스럽게 궁금해지고 이해가 되는 순간이 올 것입니다.
그렇다면 다음 포스팅부터는 객체 지향을 본격적으로 다뤄보도록 하겠습니다!
오늘도 읽어주셔서 감사합니다 😄😄
최근댓글