본문 바로가기

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

[2024-2 Java 스터디] 이민형 #6주차 (7장)

반응형

자바를 "자바라" (Java "java")

 

 

 

7. 자 우리 한 번 자바에 날개를 달아볼까?


 

 

패키지

 

 

 

패키지를 좀 딱딱하게 말해보자면

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

 

 

 

패키지는 이 파일이 어떤 패키지의 파일인지를 알려 주는 역할을 한다.

 

 

 

 

그래 패키지는 알겠어.

그러면 서브 패키지라는 것을 알아보자.

 

 

서브 패키지는 기본 패키지 안에 존재하는 하위 패키지이다.

이를 사용해 기본 패키지 내의 클래스들을 분류하여 체계적으로 관리하고, 가독성을 향상시킬 수 있다.

 

 

package house.person;

public class EungYongPark {
}

 

이렇게 패키지는 도트를 이용하여 서브 패키지를 표시한다.

house.person은 house 패키지의 서브패키지이다.

 

 

 

패키지를 사용하면 비슷한 성격의 클래스들끼리 묶을 수 있어 클래스의 분류가 용이하다.

그리고 자바 코드를 작성하다 보면 다른 사람이 작성한 자바 클래스나 라이브러리를 사용해야할 경우도 많이 생기는데

이때 클래스명이 동일한 경우도 발생할 수 있을 것이다.

 

하지만 패키지명이 다르면 클래스명이 동일해도 충돌 없이 사용할 수 있다.

 

 

 

접근을 제어하는 접근제어자

 

 

 

접근 제어자를 사용하여 변수나 메서드의 사용 권한을 설정할 수 있다.

 

  • private
  • protected
  • public
  • default

접근제어자는 private < default < protected < public 순으로 보다 많은 접근을 허용한다.

 

 

 

 

접근 제어자가 private으로 설정되었다면 private이 붙은 변수나 메서드는 해당 클래스 안에서만 접근이 가능하다.

 

public class Sample {
    private String secret;
    private String getSecret() {
        return this.secret;
    }
}

 

 

 

 

 

접근 제어자를 별도로 설정하지 않는다면

변수나 메서드는 default 접근 제어자가 자동으로 설정되어 동일한 패키지 안에서만 접근이 가능하다.

 

 

 

 

접근 제어자가 protected로 설정되었다면 protected가 붙은 변수나 메서드는 

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

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으로 설정되었다면 public이 붙은 변수나 메서드느 모든 클래스에서 사용이 가능하다.

import house.HousePark;

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

 

 

 

 

스태틱 단검

 

 

스태틱(static)은 클래스에서 공유되는 변수나 메서드를 정의할 때 사용된다.

 

 

여러가지 객체에 할당 된 변수의 값이

항상 값이 변하지 않는다면 static을 사용해 메모리 낭비를 줄일 수 있다.

 

 

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

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

 

 

static을 사용하는 또 다른 이유는 값을 공유할 수 있기 때문이다.

static으로 설정하면 같은 메모리 주소만을 바라보기 때문에 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 키워드는 프로그래밍을 할 때 메모리의 효율을 높이기 위한 목적보다는 공유의 목적으로 훨씬 더 많이 사용한다.

 

이렇게 객체가 다른데도 변수를 공유한다는 사실 정말 아름답지 않는가?

 

 

 

 

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

 

 

보는 것 처럼 메서드 앞에 static 키워드를 붙이면 

Counter.getCount()와 같이 객체 생성 없이도 클래스를 통해 메서드를 직접 호출할 수 있다.

 

 

 

자바의 디자인 패턴 중 하나인 싱글톤은 단 하나의 객체만을 생성하게 강제하는 디자인 패턴이다. 

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) 

 

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

답 : A) 

 

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

답 : C) 

 

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

답 : D) 

 

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

답 : C) 

 

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

답 : A) java.lang.String

 

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

답 : A)

 

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

답 : B) 

 

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

답 : A) 

 

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

답 : A) 

 

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

답 : B) 

 

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

답 : A) 

 

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

답 : C)

 

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

답 : C)

 

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

답 : C)

 

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

답 : A) 

 

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

답 : A)

 

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

답 : C)

 

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

답 : B)

 

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

답 : A) 

 

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

답 : B) 

 

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

답 : A) 

 

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

답 : B)

 

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

답 : A) 

 

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

답 : B)

 

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

답 : B)

 

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

답 : B)

 

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

답 : C) 

 

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

답 : A) 

 

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

답 : A) 

 

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

답 : A) 

 

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

답 : C)

 

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

답 : B) 

 

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

답 : A) 

 

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

답 : C) 

 

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

답 : B) 

 

 

반응형