본문 바로가기

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

[2024-2 Java 스터디] 김지나 #6주차

반응형

07장. 자바 날개 달기

 

07-01. 패키지

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

 

 

✅ 서브 패키지란?

- 서브 패키지: 기본 패키지 안에 존재하는 하위 패키지

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

package house.person; // 도트를 이용해 서브 패키지 표시(house 패키지의 서브 패키지 person)

public class EungYongPark {
}

 

 

✅ 패키지 사용하기

import house.HouseKim; // 클래스 사용 시 import문 추가

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

import house.*; // * 기호 사용 시 해당 패키지 내의 모든 클래스 사용 가능

public class Sample {
    public static void main(String[] args) {
        HouseKim kim = new HouseKim(); 
        HousePark park = new HousePark(); // 동일한 패키지 내에 있는 클래스는 따로 import문 필요 x
    }
}

 

 

✅ 패키지를 사용하는 이유

- 클래스 분류에 용이함

- 패키지가 다르면 동일한 클래스명 사용 가능

 

07-02. 접근 제어자

- 변수나 메서드의 사용 권한 설정 가능

- private < default < protected < public 순

 

✅ private

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

public class Sample {
    private String secret;
    private String getSecret() {
        return this.secret;
    } // secret, getSecret()은 Sample 클래스 내에서만 접근 가능
}

 

 

✅ default

- 접근 제어자의 별도 설정이 없을 때, 자동으로 default가 설정됨

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

// house/HouseKim.java
package house;  // 패키지 동일

public class HouseKim {
    String lastname = "kim";  // lastname은 default 접근제어자로 설정됨
}
// house/HousePark.java
package house;  // 패키지 동일

public class HousePark {
    String lastname = "park";

    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
        System.out.println(kim.lastname);  // HouseKim 클래스의 lastname 변수 사용 가능
    }
}

 

 

✅ protected

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

// house/HousePark.java
package house;  // 패키지 서로 다름

public class HousePark {
    protected String lastname = "park";
}

// house/person/EungYongPark.java
package house.person;  // 패키지 서로 다름

import house.HousePark;

public class EungYongPark extends HousePark {  // HousePark 상속
    public static void main(String[] args) {
        EungYongPark eyp = new EungYongPark();
        System.out.println(eyp.lastname);  // 상속한 클래스의 protected 변수 접근 가능
    }
}

 

 

✅ public

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

package house;

public class HousePark {
    protected String lastname = "park";
    public String info = "this is public message."; // public 접근 제어자
}
//
import house.HousePark;

public class Sample {
    public static void main(String[] args) {
        HousePark housePark = new HousePark();
        System.out.println(housePark.info); // 접근 가능
    }
}

 

07-03. 스태틱

- 클래스에서 공유되는 변수나 메서드 정의 시 사용

 

✅ static 변수

class HouseLee {
    static String lastname = "이"; // static 키워드: 메모리 할당을 한 번만 하게 됨
}

public class Sample {
    public static void main(String[] args) {
        HouseLee lee1 = new HouseLee();
        HouseLee lee2 = new HouseLee(); // static을 사용하지 않으면 객체마다 lastname 메모리가 생김
    }
}

 

- static은 값을 공유할 수 있기 때문에 static 변수의 값을 공유하게 됨 

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

public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}
/* 출력: 1
1 */ 
// c1, c2와 count는 서로 다른 메모리를 가리키고 있음. 객체 변수는 항상 독립적인 값을 가짐
class Counter  {
    static int count = 0;
    Counter() {
        count++;  // count는 더이상 객체변수가 아니므로 this를 제거하는 것이 좋음
        System.out.println(count); 
    }
}

public class Sample {
    public static void main(String[] args) {
        Counter c1 = new Counter();
        Counter c2 = new Counter();
    }
}
/* 출력: 1
2 */

 

 

✅ static 메서드

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

    public static int getCount() { // static 메서드
        return count;
    }
}

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

        System.out.println(Counter.getCount());  // 스태틱 메서드는 클래스를 이용하여 호출 (객체 생성 x)
    }
}

- 스태틱 메서드는 유틸리티성 메서드를 작성할 때 많이 사용됨 (재사용이 가능하고 범용 기능을 제공하는 ...)

 

 

✅ 싱글톤 패턴

- 싱글톤: 단 하나의 객체만을 생성하게 강제하는 디자인 패턴 = 클래스를 통해 생성할 수 있는 객체가 한 개뿐

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

    public static Singleton getInstance() {
        if(one==null) { // 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 출력
    }
} // 첫 호출: one:null -> one 객체 생성, 그 이후의 호출: one리턴

 

 


객관식 문제

Q1. java.util 패키지에 포함되는 클래스가 아닌 것은?

A1. D) File

 

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

A2. A) package

 

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

A3. C) import 패키지명.*;

 

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

A4. D) 모두 해당

 

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

A5. C) 접근 제어

 

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

A6. A) java.lang.String

 

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

package com.example;

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

A7. A) Hello, Java!

 

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

package com.test;

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

A8. B) 15

 

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

package com.demo;

public class Test {
    public static void main(String[] args) {
        String packageName = "com.demo";
        System.out.println("Package: " + packageName);
    }
}

A9. A) Package: com.demo

 

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

package com.example.util;

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

B) Util Test

 

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

package invalid.package;

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

A11. A) Invalid package!

 

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

A12. A) 동일 클래스 내에서만 접근 가능

 

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

A13. C) 동일 클래스, 동일 패키지, 하위 클래스

 

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

A14. C) default (패키지 접근 수준)

 

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

A15. C) 모든 클래스에서 접근 가능

 

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

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

A16. A) private 멤버는 동일 클래스에서만 접근 가능하기 때문

 

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

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

A17. A) 패키지가 다르기 때문에 default 변수에 접근할 수 없다

 

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

A18. C) 모든 클래스에서

 

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

A19. B) private

 

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

package test;

public class Main {
    private int value = 10;

    public static void main(String[] args) {
        Main m = new Main();
        System.out.println(m.value);
    }
}

A20. B) 컴파일 오류 발생

 

Q21.

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

A21. B) 컴파일 오류 발생

 

Q22.

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

A22. A) Protected Method

 

Q23.

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

A23. B) 컴파일 오류 발생

 

Q24.

package test;

public class Main {
    public static void main(String[] args) {
        Helper.display();
    }
}

class Helper {
    static void display() {
        System.out.println("Helper Method");
    }
}

A24. A) Helper Method

 

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

A25. B) 클래스 로드 시점에 메모리에 할당된다

 

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

A26. B) 인스턴스 변수

 

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

A27. B) 클래스 이름을 통해 호출할 수 있다

 

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

public class Test {
   static int count = 0;

    public Test() {
        count++;
    }

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

A28. 두번째 new Test() 뒤에 세미콜론이 붙어있다면 2가 출력됩니다....!!! 없으면 컴파일 오류 납니다

 

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

A29. A) this 키워드

 

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

A30. A) 선언된 순서대로 실행된다

 

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

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

    int value = 10;
}

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

 

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

A32. C) 공통 데이터를 여러 객체가 공유해야 할 때

 

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

public class Test {
    static int count = 0;

    static {
        count = 10;
    }

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

A33. B) 10

 

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

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

    public static void main(String[] args) {
        Test t = null;
        t.display();
    }
}

A34. A) Static Method

 

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

public class Test {
    static int count;

    static {
        count = 20;
    }

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

A35. C) 25

 

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

A36. B) 20, 10

 

코딩테스트 문제

1. 백준 #10809

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        String input = sc.nextLine();
        
        int[] positions = new int[26];
        
        for (int i = 0; i < 26; i++) {
            positions[i] = -1;
        }
        
        for (int i = 0; i < input.length(); i++) {
            char ch = input.charAt(i);
            if (positions[ch - 'a'] == -1) {
                positions[ch - 'a'] = i;
            }
        }
        
        for (int i = 0; i < 26; i++) {
            System.out.print(positions[i] + " ");
        }
        
        sc.close();
    }
}

 

2. 백준 #3052

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 number = sc.nextInt();
            remainders.add(number % 42); 
        }

        System.out.println(remainders.size());

        sc.close();
    }
}

 

반응형