본문 바로가기

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

[2024-2 Java 스터디] 강보경 #6주차

반응형

패키지

- 파일이 어떤 패키지의 파일인지 알려주는 역할

- 패키지 안에 클래스를 생성할 수 있음

- 서브 패키지 : 패키지 안에 존재하는 패키지, 도트(.)로 표시

- import해서 패키지 사용 OR * 기호를 통해 패키지 내 모든 클래스 사용

- 같은 패키지 내에서는 import 없이도 사용할 수 있음

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

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


접근 제어자

private

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

 

default

- 접근 제어자를 별도로 설정하지 않았을 때 자동 설정 -> 동일한 패키지 내에서만 접근 가능

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

public class HouseKim {
    String lastname = "kim";  // lastname은 default 접근제어자로 설정된다.
}


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

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

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 변수는 접근이 가능하다.
    }
}

- 패키지는 다르지만 변수가 protected이기 때문에 접근 가능

 

public

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


스태틱

static 변수

- 항상 값이 변하지 않을 때 사용하면 메모리 낭비를 줄일 수 있음

class HouseLee {
    static String lastname = "이";
}

public class Sample {
    public static void main(String[] args) {
        HouseLee lee1 = new HouseLee();
        HouseLee lee2 = new HouseLee();
    }
}

 

- 값 공유 가능

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

- count 값이 공유되어 count가 증가되어 출력

 

static 메서드

- 객체 생성 없이도 클래스를 통해 메서드를 직접 호출 가능

- 객체 변수 접근 불가능

- 유틸리티성 메서드 작성 시 많이 사용 (유틸리티성 메서드 : 종속X, 재사용 가능, ex) 오늘의 날씨 구하기)

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"));  // 오늘 날짜 출력
    }
}

 

싱글톤 패턴

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

- 생성자를 private으로 만들어 버리면 Singleton 클래스를 다른 클래스에서 new를 이용하여 생성할 수 없게 됨

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 객체가 딱 한 번만 만들어지도록 함


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

- a) Util Test

 

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

package invalid.package;

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

- a) Invalid package!

 

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

- b) 컴파일 오류 발생

 

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

- d) 컴파일 오류

 

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() {
        Sysem.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

import java.util.Scanner;

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

 

#3025

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