해결된 질문
작성
·
98
·
수정됨
0
안녕하세요. Java의 정적 변수, 정적 메서드(static)강의 중 9분에 나오는 빈칸 채우기 기출 문제에서 질문이 있어서 남깁니다.
Test라는 클래스에서 void타입을 리턴하는 static 메서드 main()에서 Test.check(1);을 출력하게 되는데, 이 때 Test는 클래스명이므로, 클래스에서 직접 접근 가능한 메서드이기 때문에 check는 int형 파라미터를 받는 static 메서드인 것으로 보입니다.
혹시, 여기서 앞에 public, private, protected 등을 붙일 경우 오답처리가 되나요?? 아니면, 이런 경우는 명확하게 정답의 글자 수를 알려준다는 등의 방법으로 답이 static이 될 수 밖에 없는 방식으로 문제가 출제되나요? 우선 강의를 다 들은 후에 기출문제를 풀어보려 하니 아직 문제가 나오는 형식을 잘 몰라서 질문을 남깁니다!
추가적으로, 9분 14초 정도에 나오는 기출문제에서, 인스턴스 변수인 name에 접근하기 위해서는 (파라미터를 받는 Person 생성자에서, 인스턴스 메서드인 print()에서) this 키워드를 통해 해당 생성자나 메서드 등을 호출한 주체를 찾아야 한다고 배웠었는데, 왜 여기서는 this.name으로 접근하는 것이 아닌 name으로 접근해도 에러가 발생하지 않는 것인가요??
답변 2
2
안녕하세요,
첫 번째 질문에 대한 답변:
만약 실제 문제였다면 접근제한자가 붙어있는 상태로 나왔을 겁니다.
하지만, 접근제한자가 안 붙어도 됩니다. 안 붙으면 알아서 default 접근제어자라고 해서 같은 패키지 내에서만 접근할 수 있는 메서드로 자동으로 세팅 됩니다.
(만약 실제 시험에서 접근제한자 그 자체를 넣으라고 하면, 아마도 예측하자면 public이나 private의 차이에 대한 문제가 나오지 않을까 싶네요.)
시험에서는 붙어서 나올 수도, 안 붙어서 나올 수도 있는데요.
보통 하나의 단어만 작성하라고 명시적으로 나옵니다.
그래서 이 경우에는 static
을 답으로 적으셔야 합니다.
두 번째 질문에 대한 답변:
좋은 질문이십니다. 많은 분들이 질문 남겨주시네요. 나중에 추가로 수정해야겠다는 생각이 듭니다.
이 경우에는 this를 붙여도 되고 안 붙여도 됩니다. this를 붙이는 이유는 인스턴스 변수라는 것을 명확하게 하기 위해서입니다. 지금은 name의 경우에는 누가봐도 private String name
입니다. "나"라는 객체가 가지고 있는 인스턴스 변수죠.
그렇기 때문에 Java도 헷갈려하지 않습니다. 외부 변수와 구별할 필요도 없고요.
이런 경우에는 this를 빼도 정상적으로 동작합니다.
아래처럼 this를 넣어도 똑같이 "Kim"이라고 정상적으로 동작합니다.
아래 부분은 static을 제거했으니 정상적으로 동작하는 코드입니다.
Main.java
public class Main {
public static void main(String[] args) {
Person obj = new Person("Kim");
obj.print();
}
}
class Person {
private String name;
public Person(String val) {
this.name = val;
}
public String get() {
return name;
}
public void print() {
System.out.println(name);
}
}
덧붙여서 저 코드에서 오히려 문제 삼아야할 것은 main입니다.
지금 class main으로 되어있는데 저렇게 작성하면 안됩니다. 클래스명은 보통 대문자로 시작합니다.
그래서 Main으로 적고, 안의 함수는 main이 되어 있어야 합니다.
추후 수정될 부분이오니 신경쓰지 않으셔도 됩니다.
0
안녕하세요, 인프런 AI 인턴입니다. 김민규님.
Java의 정적 변수 및 메서드에 대한 기출 문제와 관련하여, 주어진 조건 하에서 static 메서드로 선언되어야 하는지에 대한 궁금증이 있으신 것 같습니다. 이러한 유형의 문제는 기본적으로 클래스 이름을 통해 직접 접근할 수 있는 메서드를 요구하며, static 키워드는 이를 가능하게 합니다.
접근 제한자(public, private, protected): 문제에서 특별히 접근 제한자에 대한 명시가 없다면, 단순히 메서드가 static 형태임을 확인하도록 구성될 수 있습니다. 접근 제한자가 문제의 답을 결정하는 추가 조건이 있을 경우, 문제에 명시되어 있을 것입니다.
출제 형식: 기출 문제는 일반적으로 필요한 키워드의 글자 수를 힌트로 제공하기도 하며, class-level 접근을 요구하는 상황에서는 static 메서드 사용을 시사합니다. Test 클래스에서 특정 메서드를 Test.check(1)
형식으로 호출할 경우, 명확하게 파라미터와 메서드 시그니처가 static 형태여야 한다는 조건을 내포하는 형식으로 문제가 출제됩니다.
아래 유사한 질문 및 답변이 포함된 링크를 통해 이전 학생들이 어떤 방식으로 문제를 이해했는지 참고하실 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.