본문 바로가기

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

[2024-2 Java 스터디] 이가인 #6주차

반응형

목차

7-1 패키지

7-2 접근 제어자

7-3 스태틱

 


패키지

비슷한 성격의 클래스들을 모아 놓은 자바의 디렉터리 (폴더와 비슷한 개념)

 

서브 패키지

기본 패키지 안에 존재하는 하위 패키지

-> 기본 패키지 내의 클래스들을 분류, 체계적으로 관리, 가독성 향상

 

패키지를 사용하는 이유

비슷한 성격의 클래스들끼리 묶을 수 있어 클래스의 분류가 용이함

클래스명이 동일한 경우도 패키지명이 다르다면 충돌 없이 사용할 수 있다.

만약 배포용 프로그램을 만든다면 자바 클래스를 반드시 패키지 구조로 작성하는 것이 가장 좋다.

 

 


접근 제어자

변수나 메서드의 사용 권한을 설정할 수 있다. 

  • private
  • default
  • protected
  • public

private 

해당 클래스 안에서만 접근 가능

default

동일한 패키지 안에서만 접근 가능

protected

동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근 가능

public

어떤 클래스에서도 접근 가능

 

 


스태틱

클래스에서 공유되는 변수나 메서드를 정의할 때 사용됨

 

static 변수

- 메모리 할당을 딱 한 번만 하게 되어 메모리를 적게 사용할 수 있다. 

- 같은 메모리 주소만을 바라보기 때문에 static 변수의 값을 공유할 수 있다. 

static 메서드

class Counter  {
    static int count = 0;
    Counter() {
        count++;
        System.out.println(count);
    }

    public static int getCount() {
        return count;
    }
}

public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();

        System.out.println(Counter.getCount());  // 스태틱 메서드는 클래스를 이용하여 호출
    }
}
//
1
2
2

 

싱글톤 패톤

자바의 디자인 패턴 중 하나이다.

싱글톤은 단 하나의 객체만을 생성하게 강제하는 디자인 패언이고, 클래스를 통해 생성할 수 있는 객체가 한 개만 되도록 만드는 것.

 

(디자인 패턴은 소프트퉤어 설계에서 반복적으로 나타나는 문제들을 효과적으로 해결하는 데 사용되는 검증된 설계 방법론)

class Singleton {
    private Singleton() {
    }

    public static Singleton getInstance() {
        return new Singleton();  // 같은 클래스이므로 생성자 호출이 가능하다.
    }
}

public class Sample {
    public static void main(String[] args) {
        Singleton singleton = Singleton.getInstance();
    }
}

getInstance를 호출할 때마다 새로운 객체가 생성괴기 때문에 코드를 다시 수정해 보자

 

class Singleton {
    private static Singleton one;
    private Singleton() {
    }

    public static Singleton getInstance() {
        if(one==null) {
            one = new Singleton();
        }
        return one;
    }
}

public class Sample {
    public static void main(String[] args) {
        Singleton singleton1 = Singleton.getInstance();
        Singleton singleton2 = Singleton.getInstance();
        System.out.println(singleton1 == singleton2);  // true 출력
    }
}

Singleton 클래스에 one이라는 static 변수를 작성하고, getInstance 메서드에서 one값이 null인 경우에만 객체를 생성하도록 하여 one 객체가 딱 한 번만 만들어지도록 했다.


퀴즈

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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

 

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

package com.example;

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

 

 

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

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) 런타임 오류 발생

 

 

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

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) 런타임 오류 발생

 

 

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

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) 아무것도 출력되지 않음

 

 

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

package invalid.package;

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

 

 

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

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

 

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

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

 

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

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

 

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

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

 

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

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) 컴파일러가 값을 초기화하지 않았기 때문

 

 

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

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) 컴파일 오류가 발생하지 않는다.

 

 

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

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

 

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

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

 

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

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) 아무것도 출력되지 않음

 

21. 

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) 아무것도 출력되지 않음

 

 

22.

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) 아무것도 출력되지 않음

 

 

23.

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) 아무것도 출력되지 않음

 

 

24.

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) 아무것도 출력되지 않음

 

 

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

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

 

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

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

 

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

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

 

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

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) 컴파일 오류

 

 

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

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

 

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

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

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

public class Test {
    static void print() {
        System.out.println(value);
    }

    int value = 10;
}
  • A) static 메서드에서 인스턴스 변수를 사용할 수 없다
  • B) value가 초기화되지 않았다
  • C) static 메서드는 호출할 수 없다
  • D) 변수 이름 충돌이 발생했다

 

 

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

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

 

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

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) 런타임 오류 발생

 

 

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

public class Test {
    static void display() {
        Sysem.out.println("Static Method");
    }

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

 

 

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

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

 

 

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

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) 컴파일 오류 발생

 


 

코테

1.

import java.util.Scanner;

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

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

        sc.close();
    }
}

 

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> remainders = new HashSet<>();
        
        for (int i = 0; i < 10; i++) {
            int num = sc.nextInt();
            int remainder = num % 42;
            remainders.add(remainder);
        }
        
        System.out.println(remainders.size());
        
        sc.close();
    }
}
반응형