본문 바로가기

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

[2024-2 Java 스터디] 김민서 #6주차

반응형
패키지

 

패키지 : 비슷한 성격의 클래스들을 모아 놓은 자바의 디렉터리

서브 패키지 : 기본 패키지 안에 존재하는 하위 패키지 (도트(.)를 이용하여 표시)

 

패키지 사용하기

import house.HouseKim; //import 사용

public class Sample {
    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
    }
}
import house.*; //house 패키지 내의 모든 클래스 사용

public class Sample {
    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
        HousePark park = new HousePark();
    }
}

-> 클래스의 분류가 용이, 패키지가 다르다면 동일한 클래스명 사용 가능

 

 

접근 제어자

 

private < defalut < protected < public 순으로 보다 많은 접근 허용

 

1. private

private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근 가능

 

2. default

접근 제어자를 별도로 설정하지 않는다면 default가 자동으로 설정, 동일한 패키지 안에서만 접근 가능

 

3. protected

protected가 붙은 변수나 메서드는 동일 패키지의 클래스 또는 해당 클래스를 상속받은 클래스에서만 접근 가능

 

4. public

public 접근 제어자가 붙은 변수나 메서드는 어떤 클래스에서도 접근 가능

 

 

스태틱

 

static 변수 - 메모리 할당을 딱 한 번만 하게 된다, 값을 공유할 수 있다.

class Counter  {
    static int count = 0;
    Counter() {
        count++;  // count는 더이상 객체변수가 아니므로 this를 제거하는 것이 좋다.
        System.out.println(count);  // this 제거
    }
}

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

 

 

static 메서드 - 객체 생성 없이도 클래스를 통해 메서드 직접 호출 가능 (스태틱 메서드 안에서는 객체 변수 접근 불가)

import java.text.SimpleDateFormat;
import java.util.Date;

class Util {
    public static String getCurrentDate(String fmt) {
        SimpleDateFormat sdf = new SimpleDateFormat(fmt);
        return sdf.format(new Date());
    }
}

public class Sample {
    public static void main(String[] args) {
        System.out.println(Util.getCurrentDate("yyyyMMdd"));  // 오늘 날짜 출력
    }
}

 

 

싱글톤 패턴 - 단 하나의 객체만을 생성하게 강제하는 디자인 패턴

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 출력
    }
}

 

 


Quiz

 

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

2. 패키지 선언 키워드는 무엇인가요?  
답 - A) package  

3. 다음 중 사용자 정의 패키지를 사용하는 올바른 방법은?  
답 - C) import 패키지명.*;  

 

4. `java.lang` 패키지에 포함된 클래스는?  
답 - D) 모두 해당  

5. 다음 중 패키지와 관련 없는 것은?  
답 - C) 접근 제어  

6. `import` 문 없이 사용할 수 있는 클래스는?  
답 - A) java.lang.String  

 

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

package com.example;

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

 

답 - A) Hello, Java!  

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

package com.test;

public class Main {
    public static void main(String[] args) {
        int a = 10;
        System.out.println(a + 5);
    }
}

 

답 - B) 15  

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  

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

package com.example.util;

public class Test {
    public static void main(String[] args) {
        System.out.println("Util Test");
    }
}

 

답 - B) Util Test  

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

package invalid.package;

public class Test {
    public static void main(String[] args) {
        System.out.println("Invalid package!");
    }
}

 

답 - B) 컴파일 오류 발생 

12. 다음 중 private 접근 제어자의 특징은?  
답 - A) 동일 클래스 내에서만 접근 가능  

13. protected 접근 제어자는 어디서 접근 가능한가요?  
답 - C) 동일 클래스, 동일 패키지, 하위 클래스  

14. 접근 제어자가 없는 경우 기본 접근 수준은 무엇인가요?  
답 - C) default (패키지 접근 수준)  

15. 다음 중 public 접근 제어자의 설명으로 올바른 것은?  
답 - C) 모든 클래스에서 접근 가능  

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 멤버는 동일 클래스에서만 접근 가능하기 때문  

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 변수에 접근할 수 없다  

18. public 클래스와 메서드는 어디에서 접근 가능한가요?  
답 - C) 모든 클래스에서  

19. 접근 제어자 중 가장 제한적인 것은 무엇인가요?  
답 - B) private  

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

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();
    }
}

 

답 - B) 컴파일 오류 발생  

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  

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);
    }
}

 

답 - B) 컴파일 오류 발생  

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  

25. static 키워드의 주요 특징은 무엇인가요?  
답 - B) 클래스 로드 시점에 메모리에 할당된다  

26. static 키워드가 사용될 수 없는 곳은?  
답 - B) 인스턴스 변수  

27. 다음 중 static 키워드로 선언된 메서드의 특징은?  
답 - B) 클래스 이름을 통해 호출할 수 있다  

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);
    }
}

 

답 - C) 2  

29. static 메서드에서 사용할 수 없는 것은?  
답 - A) this 키워드  

30. static 블록이 여러 개인 경우 실행 순서는?  
답 - A) 선언된 순서대로 실행된다  

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

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

    int value = 10;
}

 답 - A) static 메서드에서 인스턴스 변수를 사용할 수 없다  

32. 다음 중 static 키워드의 올바른 사용 예는?  
답 - C) 공통 데이터를 여러 객체가 공유해야 할 때  

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

public class Test {
    static int count = 0;

    static {
        count = 10;
    }

    public static void main(String[] args) {
        System.out.println(count);
    }
}

 

답 - B) 10  

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

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  

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

public class Test {
    static int count;

    static {
        count = 20;
    }

    public static void main(String[] args) {
        count += 5;
        System.out.println(count);
    }
}

 

답 - 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);
    }
}

답 - B) 20, 10

 

 

코딩테스트

백준 #10809

https://www.acmicpc.net/problem/10809

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.next();
        scanner.close();

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

 

 

백준 #3052

https://www.acmicpc.net/problem/3052

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean[] remainders = new boolean[42]; 

        for (int i = 0; i < 10; i++) {
            int num = scanner.nextInt();
            remainders[num % 42] = true; 
        }
        scanner.close();

        int count = 0;
        for (boolean remainder : remainders) {
            if (remainder) {
                count++;
            }
        }

        System.out.println(count);
    }
}
반응형