• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    미해결

public, class, static, void 언제 어떻게 조합해서 쓰는건지

23.02.02 07:39 작성 조회수 2.33k

1

 현재 챕터07 접근제어자(후반전) 까지 강의를 들었고 퀴즈도 다 풀어냈습니다.

그런데 public, class, static, void 등을 조합해서 코드 앞부분에 쓰는데 언제 어떻게 왜 조합해서 저것들을 붙이는 건지 정확한 개념을 잘 모르겠습니다. 이럴때는 강의를 다시 돌려보며 개념을 알고 가야하나요? 아니면 그냥 강의 쭉 들으면서 서서히 익히면 되는건가요

유튜브 영상으로 9시간 다 보고 인프런 결제했는데 갑자기 진행속도가 너무 빨라진 듯한 느낌이 듭니다. 유튜브 기초 9시간때는 이해하면서 잘 들었는데 지금은 코드 따라적기 바쁘네요ㅠㅠ

답변 3

·

답변을 작성해보세요.

3

안녕하세요?
질문주신 부분에 대한 이해의 어려움, 충분히 공감합니다. 저도 그랬으니까요. 사실 이런 건 외운다고 되는 것은 아닙니다. 많이 부딪쳐 봐야하며 어떤 경우에 public 을 쓸지, 어떤 경우에 private 을 쓸지, 또 어떤 변수나 메소드에 static 을 붙일지는 다양한 경험이 쌓이다보면 자연스럽게 친숙해질거에요. 각각 필요한 상황이 다 다르니까요 🤗

그래도 개념 정도는 한 번 정리하고 넘어가시는 게 좋습니다.

(1) public 과 private
public 은 언제 어디서나 누구든 접근할 수 있도록 '완전 공개' 를 위한 용도로 사용합니다. 누구에게나 오픈되어 있는 공간이라고 생각하시면 됩니다. 아무나 앉을 수 있는 공원의 벤치처럼요. 만약 변수나 메소드를 private 으로 만든다면 그 클래스 외부에서는 아무나 접근할 수가 없습니다. 마치 어느 가정집의 소파처럼요. 그 집의 식구들만 앉을 수 있겠죠.

(2) static 과 non-static
static 은 모든 인스턴스들이 공통으로 사용하는 값을 관리하거나 별도의 인스턴스를 만들지 않고도 사용할 수 있는 메소드를 위해 사용합니다. 예를 들어 어떤 클래스로부터 인스턴스를 만들때마다 몇 개를 만들었는지 관리하기 위해 static 변수를 하나 두었다고 가정하겠습니다.

public class MyClass {
    public static int count = 0;
    MyClass() {
        count++;
        System.out.println("지금까지 만들어진 인스턴스 수 : " + count);
    }
}

그리고 main 메소드에서 이 클래스로부터 3개의 객체를 만들어보겠습니다.

public class Main {
    public static void main(String[] args) {
        MyClass my1 = new MyClass();
        MyClass my2 = new MyClass();
        MyClass my3 = new MyClass();
    }
}

그러면 my1, my2, my3 객체가 각각 생성될 때마다 count 값은 1씩 증가하게 되며 다음과 같은 실행 결과를 낼 것입니다.

지금까지 만들어진 인스턴스 수 : 1
지금까지 만들어진 인스턴스 수 : 2
지금까지 만들어진 인스턴스 수 : 3

static 변수인 count 는 딱 하나만 존재하며 모든 인스턴스가 공유하게 됩니다. 그래서 1, 2, 3 으로 값이 증가할 수 있게 되는거죠. 만약 static 을 적지 않았다면, 즉 non-static 변수였다면 각 인스턴스마다 서로 다른 count 라는 변수를 각각 가지게 됩니다.

public class MyClass {
    public int count = 0; // non-static 변수
    MyClass() {
        count++;
        System.out.println("지금까지 만들어진 인스턴스 수 : " + count);
    }
}

MyClass 의 count 변수 앞에 static 을 제외하고 다시 main 메소드 동작을 실행시켜보면 이번에는 각 인스턴스 변수의 count 값이 0 에서 1 로 증가되며 다음과 같은 결과를 낼 것입니다.

지금까지 만들어진 인스턴스 수 : 1
지금까지 만들어진 인스턴스 수 : 1
지금까지 만들어진 인스턴스 수 : 1

우리가 원한 결과가 아닌 것을 알 수 있죠 😲

static 메소드는 클래스로부터 인스턴스를 만들지 않고도 메소드를 바로 사용할 필요가 있는 경우에 종종 사용합니다. 가령 두 수를 받아서 더해주는 간단한 기능을 하는 단순 계산기 클래스를 만든다면 굳이 인스턴스를 만들 필요 없이 전달값만으로 모든 동작을 처리할 수 있으니 static 메소드로 적합하죠.

public class SimpleCalc {    
    public static int add(int num1, int num2) {
        return num1 + num2;
    }
}

이런 클래스가 있다면 main 메소드에서는 간단하게 아래와 같이 사용이 가능할 겁니다.

public class Main {
    public static void main(String[] args) {
        int result = SimpleCalc.add(3, 5);
        System.out.println(result);
    }
}

3 과 5 를 더한 실행 결과는 이렇게 나오죠.

8

이런 메소드는 굳이 클래스로부터 인스턴스를 만들 필요가 없습니다. 만약 SimpleCalc 클래스가 아래와 같았다면 어땠을까요?

public class SimpleCalc {    
    public int add(int num1, int num2) { // non-static
        return num1 + num2;
    }
}

main 메소드에서는 귀찮게 인스턴스를 먼저 만든 다음에야 메소드를 호출할 수 있을 것입니다.

public class Main {
    public static void main(String[] args) {
        SimpleCalc calc = new SimpleCalc(); // 객체 생성
        int result = calc.add(3, 5);
        System.out.println(result);
    }
}

(3) void
void 는 비어 있음을 뜻합니다. 메소드에서는 어떤 동작을 하고 나서 값을 반환하거나 반환하지 않을 수 있어요. 가령 바로 앞 예제의 add() 메소드는 두 수를 전달 받아서 더한 결과를 메소드를 호출한 쪽으로 반환해주는 것이죠. 이때 반환값의 자료형을 메소드 이름 앞에 적어줍니다. 여기서는 정수인 int 라고 적었구요. 그런데 때로는 메소드 내에서 그냥 어떤 동작을 처리하고 거기서 바로 끝나는 경우도 있습니다. 굳이 메소드를 호출한 쪽으로 결과를 반환할 필요가 없는 것이죠. 이때는 반환값이 없기 때문에 메소드 이름 앞에 void 라고 적어줍니다. 반환값이 있으면 반환값의 자료형, 없으면 void 로 적는다 정도로 생각해주셔도 좋습니다.

(4) class
class 는 클래스를 정의할 때 붙이는 것이며 하나의 파일 내에도 여러 개의 클래스를 정의할 수 있습니다. 이때 파일명과 동일한 이름의 클래스는 반드시 public 으로 적으셔야 하며 나머지는 public 없이 적으셔야 합니다. 우선은 이 정도로만 생각하고 지나가셔도 좋습니다.

앞서 말씀드렸듯 이들은 직접 다양한 프로그램을 만들어 보는 과정에서, 또 다른 사람이 작성한 코드를 보고 분석하는 과정에서 자연스럽게 익혀질 것입니다. 그러다 보면 '아하!' 하는 순간이 분명 올 거에요 😊
감사합니다.

Eun Jee님의 프로필

Eun Jee

2024.01.30

좀 퍼갈게요

너무 잘 정리해주셔서
^^

0

ttt23님의 프로필

ttt23

2023.09.13

저도 동일한 챕터에서 위의 개념이 너무 헷갈렸는데 상세히 정리해주셔서 감사합니다. 답변 보고 이해하고 갑니다:)

0

sjp9506님의 프로필

sjp9506

질문자

2023.02.03

오우.. 이렇게 자세히 설명해주시다니 감사합니다