패키지
- 파일이 어떤 패키지의 파일인지 알려주는 역할
- 패키지 안에 클래스를 생성할 수 있음
- 서브 패키지 : 패키지 안에 존재하는 패키지, 도트(.)로 표시
- 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();
}
}
'WINK-(Web & App) > JAVA 스터디' 카테고리의 다른 글
[2024-2 Java 스터디] 이가인 #6주차 (1) | 2024.11.21 |
---|---|
[2024-2 Java 스터디] 김민서 #6주차 (1) | 2024.11.20 |
[2024-2 Java 스터디] 김지나 #6주차 (0) | 2024.11.20 |
Java[2024-2 Java 스터디] 이민형 #5주차 6장 (0) | 2024.11.14 |
[2024-2 Java 스터디] 김지수 #5주차 (0) | 2024.11.14 |