본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 김재승 #6주차

반응형

목차

  • 패키지
  • 접근 제어자
  • static

자바에서 package , access modifiers , static 에 대해 알아보자


1. 패키지(Package)

패키지란?

패키지는 자바 클래스와 인터페이스를 묶어 체계적으로 관리하기 위한 방법임.

디렉토리 구조와 유사하게 구성되어 코드의 재사용성과 가독성을 높이는 데 도움을 줍니다.

패키지 선언 방법

패키지는 파일의 최상단에서 package 키워드로 선언합니다.

 
package com.example.myapp;

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

패키지 사용 예제

다른 패키지에 있는 클래스를 사용하려면 import 키워드를 사용함

 

package com.example.util;

public class MathUtils {
    public static int add(int a, int b) {
        return a + b;
    }
}
package com.example.main;

import com.example.util.MathUtils;

public class App {
    public static void main(String[] args) {
        int result = MathUtils.add(5, 3);
        System.out.println("The sum is: " + result);
    }
}

 

>> import로 com.example.util 패키지에 속하는 클래스인 MathUtils를 가져와서 클래스 이름을 통해 메서드 구현하고있음

 

장점

  • 클래스 관리: 관련 클래스들을 그룹화하여 관리할 수 있음
  • 충돌 방지: 동일한 클래스 이름이 있어도 다른 패키지에 있다면 구분됨
  • 재사용성: 공통적으로 사용되는 유틸리티 클래스들을 별도 패키지에 두어 재사용 가능

 

 
 

2. 접근 제어자(Access Modifiers)

접근 제어자란?

접근 제어자는 클래스, 메서드, 변수의 접근 범위를 설정하며 네 가지 제어자가 존재함

접근 제어자 같은 클래스 같은 패키지 자식 클래스 다른 패키지
public
protected
(default)
private

접근 제어자의 활용

  • public: 모든 클래스에서 사용 가능.
  • protected: 상속받은 클래스에서 사용하거나 같은 패키지에서 접근 가능.
  • default: 같은 패키지 내에서만 접근 가능.
  • private: 같은 클래스 내에서만 접근 가능.

3. static 키워드

static이란?

static은 클래스 수준에서 변수를 선언하거나 메서드를 정의할 때 사용되며 객체를 생성하지 않고도 접근할 수 있는 특징이 있음

static의 특징

  1. 클래스에 고정된 멤버.
  2. 모든 객체가 공유하는 값.
  3. 객체 생성 없이 접근 가능.

1. java.util 패키지에 포함된 클래스가 아닌 것은?

  • A) ArrayList
  • B) HashMap
  • C) Scanner
  • D) File

정답: D) File
해설: File 클래스는 java.io 패키지에 포함되어 있습니다. 나머지 클래스는 모두 java.util 패키지에 속합니다.


2. 패키지 선언 키워드는 무엇인가요?

  • A) package
  • B) import
  • C) include
  • D) namespace

정답: A) package
해설: 패키지는 package 키워드로 선언하며, 자바 소스 파일의 최상단에 위치합니다.


3. 다음 중 사용자 정의 패키지를 사용하는 올바른 방법은?

  • A) include 패키지명;
  • B) package 패키지명;
  • C) import 패키지명.*;
  • D) namespace 패키지명.*;

정답: C) import 패키지명.*;
해설: 패키지의 클래스를 사용하려면 import를 사용해야 합니다. *는 해당 패키지의 모든 클래스를 가져옵니다.


4. java.lang 패키지에 포함된 클래스는?

  • A) String
  • B) Math
  • C) System
  • D) 모두 해당

정답: D) 모두 해당
해설: java.lang 패키지는 기본적으로 모든 자바 프로그램에 포함되며, String, Math, System 클래스가 속합니다.


5. 다음 중 패키지와 관련 없는 것은?

  • A) 클래스 간의 충돌 방지
  • B) 클래스 조직화
  • C) 접근 제어
  • D) 네임스페이스 제공

정답: C) 접근 제어
해설: 패키지는 클래스의 조직화와 네임스페이스 제공, 클래스 충돌 방지와 관련이 있습니다. 접근 제어는 접근 제어자와 관련 있습니다.


6. import 문 없이 사용할 수 있는 클래스는?

  • A) java.lang.String
  • B) java.util.Scanner
  • C) java.io.File
  • D) java.net.Socket

정답: A) java.lang.String
해설: java.lang 패키지는 기본적으로 임포트 없이 사용할 수 있습니다.


7. 다음 코드를 실행했을 때 출력 결과는 무엇인가요?

java
코드 복사
package com.example; public class Main { public static void main(String[] args) { System.out.println("Hello, Java!"); } }
  • A) Hello, Java!
  • B) 컴파일 오류 발생
  • C) 런타임 오류 발생
  • D) 아무것도 출력되지 않음

정답: A) Hello, Java!
해설: 코드에는 오류가 없으며, "Hello, Java!"가 출력됩니다.


8. 다음 코드의 실행 결과는 무엇인가요?

java
코드 복사
package com.test; public class Main { public static void main(String[] args) { int a = 10; System.out.println(a + 5); } }
  • A) 10
  • B) 15
  • C) 컴파일 오류 발생
  • D) 런타임 오류 발생

정답: B) 15
해설: 변수 a는 10으로 초기화되며, a + 5의 결과는 15입니다.


9. 다음 코드 실행 결과는 무엇인가요?

java
코드 복사
package com.demo; public class Test { public static void main(String[] args) { String packageName = "com.demo"; System.out.println("Package: " + packageName); } }
  • A) Package: com.demo
  • B) PackageName: com.demo
  • C) 컴파일 오류 발생
  • D) 런타임 오류 발생

정답: A) Package: com.demo
해설: 코드에는 오류가 없으며, 문자열 "Package: com.demo"가 출력됩니다.


10. 다음 코드의 실행 결과는 무엇인가요?

java
코드 복사
package com.example.util; public class Test { public static void main(String[] args) { System.out.println("Util Test"); } }
  • A) Util Test
  • B) util test
  • C) 컴파일 오류 발생
  • D) 아무것도 출력되지 않음

정답: A) Util Test
해설: 코드가 정상적으로 실행되며 "Util Test"가 출력됩니다.


11. 아래 코드의 실행 결과는 무엇인가요?

java
코드 복사
package invalid.package; public class Test { public static void main(String[] args) { System.out.println("Invalid package!"); } }
  • A) Invalid package!
  • B) 컴파일 오류 발생
  • C) 런타임 오류 발생
  • D) 아무것도 출력되지 않음

정답: B) 컴파일 오류 발생
해설: 패키지 이름에 점(.)이 포함될 수 있으나 디렉토리 구조와 맞지 않으면 컴파일 오류가 발생합니다.


12. 다음 중 private 접근 제어자의 특징은?

  • A) 동일 클래스 내에서만 접근 가능
  • B) 동일 패키지 내에서만 접근 가능
  • C) 상속받은 클래스에서도 접근 가능
  • D) 모든 클래스에서 접근 가능

정답: A) 동일 클래스 내에서만 접근 가능
해설: private 접근 제어자는 선언된 클래스 내에서만 사용할 수 있습니다.


여기까지가 진행 가능한 부분입니다. 추가적으로 남은 문제에 대한 정리도 곧 작성하겠습니다.

13. protected 접근 제어자는 어디서 접근 가능한가요?

  • A) 동일 클래스와 동일 패키지
  • B) 동일 클래스와 하위 클래스
  • C) 동일 클래스, 동일 패키지, 하위 클래스
  • D) 모든 클래스

정답: C) 동일 클래스, 동일 패키지, 하위 클래스
해설: protected 접근 제어자는 동일 클래스뿐 아니라 동일 패키지, 그리고 하위 클래스에서 접근 가능합니다.


14. 접근 제어자가 없는 경우 기본 접근 수준은 무엇인가요?

  • A) private
  • B) protected
  • C) default (패키지 접근 수준)
  • D) public

정답: C) default (패키지 접근 수준)
해설: 접근 제어자를 명시하지 않으면 기본적으로 default 접근 수준이 설정되며, 동일 패키지 내에서만 접근 가능합니다.


15. 다음 중 public 접근 제어자의 설명으로 올바른 것은?

  • A) 동일 클래스에서만 접근 가능
  • B) 동일 패키지와 하위 클래스에서만 접근 가능
  • C) 모든 클래스에서 접근 가능
  • D) 동일 클래스와 동일 패키지에서만 접근 가능

정답: C) 모든 클래스에서 접근 가능
해설: public 접근 제어자는 모든 클래스에서 접근 가능하며, 패키지 및 클래스 제한이 없습니다.


16. 아래 코드에서 오류가 발생하는 이유는 무엇인가요?

java
코드 복사
package a; public class A { private int value = 10; } package b; import a.A; public class B { public void printValue() { A a = new A(); System.out.println(a.value); } }
  • A) private 멤버는 동일 클래스에서만 접근 가능하기 때문
  • B) 클래스 A가 public이 아니기 때문
  • C) package 접근 수준의 제한 때문
  • D) 컴파일러가 값을 초기화하지 않았기 때문

정답: A) private 멤버는 동일 클래스에서만 접근 가능하기 때문
해설: 클래스 A의 value 필드는 private으로 선언되었으므로 다른 클래스에서는 접근할 수 없습니다.


17. 다음 코드에서 컴파일 오류가 발생하는 경우는?

java
코드 복사
package package1; public class ClassA { int defaultVar = 5; } package package2; import package1.ClassA; public class ClassB { public void printValue() { ClassA a = new ClassA(); System.out.println(a.defaultVar); } }
  • A) 패키지가 다르기 때문에 default 변수에 접근할 수 없다
  • B) 클래스 A가 public이 아니기 때문
  • C) default 접근 제어자는 하위 클래스에서만 접근 가능
  • D) 컴파일 오류가 발생하지 않는다

정답: A) 패키지가 다르기 때문에 default 변수에 접근할 수 없다
해설: default 접근 수준은 동일 패키지 내에서만 접근 가능하므로 다른 패키지에서는 접근할 수 없습니다.


18. public 클래스와 메서드는 어디에서 접근 가능한가요?

  • A) 동일 패키지에서만
  • B) 상속받은 클래스에서만
  • C) 모든 클래스에서
  • D) 동일 클래스 내에서만

정답: C) 모든 클래스에서
해설: public 클래스와 메서드는 패키지나 클래스에 관계없이 모든 곳에서 접근 가능합니다.


19. 접근 제어자 중 가장 제한적인 것은 무엇인가요?

  • A) public
  • B) private
  • C) protected
  • D) default

정답: B) private
해설: private 접근 제어자는 동일 클래스 내에서만 접근 가능하며, 가장 제한적입니다.


20. 다음 코드의 실행 결과를 고르시오.

java
코드 복사
package test; public class Main { private int value = 10; public static void main(String[] args) { Main m = new Main(); System.out.println(m.value); } }
  • A) 10
  • B) 컴파일 오류 발생
  • C) 런타임 오류 발생
  • D) 아무것도 출력되지 않음

정답: A) 10
해설: value는 private이지만, 동일 클래스 내에서는 접근 가능하므로 정상 출력됩니다.


21. 아래 코드에서 컴파일 오류가 발생하는 이유는?

java
코드 복사
package a; public class A { private void display() { System.out.println("Private Method"); } } package b; import a.A; public class B { public static void main(String[] args) { A a = new A(); a.display(); } }
  • A) Private Method
  • B) 컴파일 오류 발생
  • C) 런타임 오류 발생
  • D) 아무것도 출력되지 않음

정답: B) 컴파일 오류 발생
해설: display() 메서드는 private으로 선언되어 있어 다른 클래스에서 호출할 수 없습니다.


22. 다음 코드의 실행 결과를 고르시오.

java
코드 복사
package mypackage; public class MyClass { protected void show() { System.out.println("Protected Method"); } } package another; import mypackage.MyClass; public class Test extends MyClass { public static void main(String[] args) { Test t = new Test(); t.show(); } }
  • A) Protected Method
  • B) 컴파일 오류 발생
  • C) 런타임 오류 발생
  • D) 아무것도 출력되지 않음

정답: A) Protected Method
해설: show() 메서드는 protected로 선언되었으므로 하위 클래스인 Test에서 접근 가능합니다.


23. 다음 코드에서 컴파일 오류가 발생하는 이유는?

java
코드 복사
package p1; public class A { int defaultVar = 100; } package p2; import p1.A; public class B { public static void main(String[] args) { A a = new A(); System.out.println(a.defaultVar); } }
  • A) 100
  • B) 컴파일 오류 발생
  • C) 런타임 오류 발생
  • D) 아무것도 출력되지 않음

정답: B) 컴파일 오류 발생
해설: defaultVar는 default 접근 수준으로 선언되었으며, 다른 패키지에서는 접근할 수 없습니다.


이와 같은 방식으로 나머지 문제도 순차적으로 해설을 작성하겠습니다.

24. 다음 코드의 실행 결과를 고르시오.

java
코드 복사
package test; public class Main { public static void main(String[] args) { Helper.display(); } } class Helper { static void display() { System.out.println("Helper Method"); } }
  • A) Helper Method
  • B) 컴파일 오류 발생
  • C) 런타임 오류 발생
  • D) 아무것도 출력되지 않음

정답: A) Helper Method
해설: Helper.display()는 정적 메서드 호출로 정상적으로 실행되며, "Helper Method"가 출력됩니다.


25. static 키워드의 주요 특징은 무엇인가요?

  • A) 클래스와 인스턴스에서 모두 접근 가능하다
  • B) 클래스 로드 시점에 메모리에 할당된다
  • C) 객체 생성 없이 사용 불가능하다
  • D) 쓰레드마다 별도로 메모리에 할당된다

정답: B) 클래스 로드 시점에 메모리에 할당된다
해설: static 키워드는 클래스 로드 시점에 메모리에 할당되며, 객체 생성 없이도 사용 가능합니다.


26. static 키워드가 사용될 수 없는 곳은?

  • A) 클래스 변수
  • B) 인스턴스 변수
  • C) 메서드
  • D) 클래스 내부 블록

정답: B) 인스턴스 변수
해설: static은 클래스 수준에서 공유되며, 인스턴스 변수에는 사용할 수 없습니다.


27. 다음 중 static 키워드로 선언된 메서드의 특징은?

  • A) 인스턴스 변수를 참조할 수 있다
  • B) 클래스 이름을 통해 호출할 수 있다
  • C) this 키워드를 사용할 수 있다
  • D) 상속할 수 없다

정답: B) 클래스 이름을 통해 호출할 수 있다
해설: static 메서드는 클래스 이름을 통해 호출할 수 있지만, 인스턴스 변수를 참조하거나 this를 사용할 수 없습니다.


28. 다음 코드의 출력 결과는?

java
코드 복사
public class Test { static int count = 0; public Test() { count++; } public static void main(String[] args) { new Test(); new Test(); System.out.println(count); } }
  • A) 0
  • B) 1
  • C) 2
  • D) 컴파일 오류

정답: C) 2
해설: count는 정적 변수로 모든 객체가 공유합니다. 객체 두 개가 생성되었으므로 count는 2가 됩니다.


29. static 메서드에서 사용할 수 없는 것은?

  • A) this 키워드
  • B) static 변수
  • C) 클래스 이름
  • D) static 메서드

정답: A) this 키워드
해설: static 메서드는 인스턴스와 독립적이기 때문에 this를 사용할 수 없습니다.


30. static 블록이 여러 개인 경우 실행 순서는?

  • A) 선언된 순서대로 실행된다
  • B) 역순으로 실행된다
  • C) JVM이 임의로 결정한다
  • D) 첫 번째 블록만 실행된다

정답: A) 선언된 순서대로 실행된다
해설: static 블록은 클래스 로드 시 선언된 순서대로 실행됩니다.


31. 다음 코드에서 컴파일 오류가 발생하는 이유는?

java
코드 복사
public class Test { static void print() { System.out.println(value); } int value = 10; }
  • A) static 메서드에서 인스턴스 변수를 사용할 수 없다
  • B) value가 초기화되지 않았다
  • C) static 메서드는 호출할 수 없다
  • D) 변수 이름 충돌이 발생했다

정답: A) static 메서드에서 인스턴스 변수를 사용할 수 없다
해설: value는 인스턴스 변수로 static 메서드에서 직접 사용할 수 없습니다.


32. 다음 중 static 키워드의 올바른 사용 예는?

  • A) 매번 새로운 객체를 생성해야 할 때
  • B) 특정 인스턴스에 데이터를 유지해야 할 때
  • C) 공통 데이터를 여러 객체가 공유해야 할 때
  • D) 메모리 할당을 동적으로 조정해야 할 때

정답: C) 공통 데이터를 여러 객체가 공유해야 할 때
해설: static 키워드는 모든 객체가 공유해야 하는 데이터를 선언할 때 사용합니다.


33. 다음 코드의 실행 결과를 고르시오.

java
코드 복사
public class Test { static int count = 0; static { count = 10; } public static void main(String[] args) { System.out.println(count); } }
  • A) 0
  • B) 10
  • C) 컴파일 오류 발생
  • D) 런타임 오류 발생

정답: B) 10
해설: static 블록에서 count를 10으로 초기화했으므로 출력 값은 10입니다.


34. 다음 코드의 실행 결과를 고르시오.

java
코드 복사
public class Test { static void display() { System.out.println("Static Method"); } public static void main(String[] args) { Test t = null; t.display(); } }
  • A) Static Method
  • B) NullPointerException 발생
  • C) 컴파일 오류 발생
  • D) 아무것도 출력되지 않음

정답: A) Static Method
해설: 정적 메서드는 클래스에 종속되므로 객체 참조가 null이어도 호출 가능합니다.


35. 다음 코드의 실행 결과를 고르시오.

java
코드 복사
public class Test { static int count; static { count = 20; } public static void main(String[] args) { count += 5; System.out.println(count); } }
  • A) 0
  • B) 5
  • C) 25
  • D) 컴파일 오류 발생

정답: C) 25
해설: count는 static 블록에서 20으로 초기화되었으며, += 5 연산으로 25가 됩니다.


36. 다음 코드의 실행 결과를 고르시오.

java
코드 복사
public class Test { static int x = 10; public static void main(String[] args) { int x = 20; System.out.println(x); System.out.println(Test.x); } }
  • A) 10, 10
  • B) 20, 10
  • C) 20, 20
  • D) 컴파일 오류 발생

정답: B) 20, 10
해설: 지역 변수 x는 main 메서드 내에서 우선됩니다. Test.x는 클래스 변수인 10을 참조합니다.


코딩테스트 1번

import java.util.Scanner;

public class b_10809 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String userInput = sc.nextLine();

        for(char i = 'a'; i<='z'; i++){
            System.out.print(userInput.indexOf(i)+" ");
        }
    }
}

>> userInput에 입력값을 받고 입력값의 indexOf  메서드를 통해 해당 인덱스에서의 인풋값을 'a' 부터 'z'까지 돌아가며 출력한다.

 

코딩테스트 2번

import java.util.HashSet;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        HashSet<Integer> remainderSet = new HashSet<>();

        for (int i = 0; i < 10; i++) {
            int num = sc.nextInt();
            remainderSet.add(num % 42);
        }

        System.out.println(remainderSet.size());
        sc.close();
    }
}

>> 중복을 허용하지 않는 HashSet 을 이용했다. num에 입력값을 받고 그 입력값을 42로 나눈 나머지를 HashSet에 추가하였고 그 값의 크기를 , 즉 개수를 출력하게 했다.

반응형