본문 바로가기

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

[2024-2 Java 스터디] 김태일 #6주차

반응형

07. 자바 날개 달기

 

07-1 패키지

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

 

1. 서브 패키지란?

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

- 도트(.)을 이용하여 서브 패키지 표시

ex) house 패키지 안에 person이라는 서브 패키지를 만든다면 -> house.person 으로 표시

 

2. 패키지 사용하기

- import를 활용해 사용 가능

import house.person;

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

 

 (*)기호를 이용해 패키지 내의 모든 클래스 사용 가능

import house.*;

 

3. 패키지를 사용하는 이유

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

- 패키지명이 다르면 동일한 클래스명이 있어도 충돌 없이 사용 가능

 

 

07-2 접근 제어자

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

 

1. private

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

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

 

2. default

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

- 접근 제어자를 별도로 설정하지 않는다면 default가 자동으로 설정

package house;  // 패키지가 동일하다.

public class HousePark {
    String lastname = "park";      //lastname은 default 접근제어자로 설정, 동일한 패키지 내에서 사용 가능

    public static void main(String[] args) {
        HouseKim kim = new HouseKim();
        System.out.println(kim.lastname); 
    }
}

 

3. protected

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

package house;

public class HousePark {
    protected String lastname = "park";
}
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 변수는 접근이 가능하다.
    }
}

 

4. public

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

package house;

public class HousePark {
    protected String lastname = "park";
    public String info = "this is public message.";
}
import house.HousePark;

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

 

07-3 스태틱

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

 

1. static 변수

- 메모리 할당을 딱 한번만 하게 되어 메모리 적게 사용 가능

class Counter  {
    static int count = 0;     //count값 static으로 설정
    Counter() {
        count++;       //this.count로 설정 안하는 것이 좋다 (count는 더이상 객체변수가 아님)
        System.out.println(this.count);
    }
}

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

 

2. 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());  // 스태틱 메서드는 클래스를 이용하여 호출
    }
}

 

3. 싱글톤 패턴

- 클래스를 통해 생성할 수 있는 객체가 한 개만 되도록 만드는 것

class Singleton {
    private static Singleton one;   //Singleton클래스의 one 변수 static으로 설정
    private Singleton() {
    }

    public static Singleton getInstance() {    //객체 한번만 생성
        if(one==null) {      //one은 static변수이므로 한번 생성되면 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 출력
    }
}

 

 

객관식 문제

 

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

답 : A) 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

 

 

코딩 테스트

https://www.acmicpc.net/problem/10809 - 브1

 

https://www.acmicpc.net/problem/3052 - 브2

 

반응형