다잘하고싶어

자바 클래스와 객체(2) 본문

이론학습/JAVA

자바 클래스와 객체(2)

챙영잉 2023. 1. 19. 13:53

패키지

  • 프로그램의 많은 클래스를 관리하기 위해서 패키지를 이용
  • 패키지의 구분은 .(dot) 연산자를 이용
  • 패키지는 클래스와 관련있는 인터페이스를 모아두기 위한 공간 → 정리
  • 패키지 이름은 시중에 나와있는 패키지들과 구분되게 지어야 함
  • 일반적으로 소속이나 회사의 도메인을 사용

→ 장점1. 정리가능

→ 장점2. 패키지 단위로 접근제어

→ 장점3. 클래스를 구별

 

임포트 import

다른 패키지에 있는 클래스를 사용하기 위해서는 import 과정이 필요.

 

→ ex. Movie 클래스에서 Book 클래스를 사용하기 위해서는 import 과정이 필요하다.

  • 선언형식
import package_name.class_name;
import package_name.*; (모두)

위와 같이 패키지를 생성했을 때

  • 우클릭 → Show In → System Explorer 에 가서 보면? (폴더 형식으로 확인 가능)

pkg3 은 pkg2의 내부에, pkg2는 pkg1 내부에 포함되어있다. 왜? . (점) 으로 연결지었기 때문

 

 

(+)

 

서로 다른 패키지에 있는 이름이 같은 클래스를 두개 이상 사용하려면 에러가 난다.

만약 사용하고 싶다면?

: 생략해서 사용할 수 없고 패키지명.클래스명 ⇒ 풀패키지 이름을 사용해야한다.

  • 풀패키지 이름을 사용한 예제

Q. 아래의 상황에서 4번라인에 에러가 나는 이유는?

 

→ Person 이라는 객체가 패키지2 와 패키지3에서 동일한 이름을 가지고 있으므로 에러 발생

→ 두개의 패키지에서 동일한 이름을 가진 객체를 둘 다 사용하고 싶다면? ⇒ 풀패키지사용

(+) 이미 16번 라인에서 풀패키지를 사용해서 선언했으므로, 3번과 4번라인의 import 문은 무의미하다 ( 4번라인을 지워도 3번라인에 노란줄 경고가 뜨는 이유)

⇒   import 문은 풀패키지를 사용하고 싶지 않을 때 사용하는 것임을 기억하기

 

import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;

위의 import 문을 아래와 같이 바꿔서 사용할 수 있다.

import java.util.*;

Q. import java.util.* 구문이 있는데 왜 17번 라인이 에러가 날까?

→ * 는 모든 하위패키지를 포함하지 않는다.

→ 즉, import java.util.logging.*; 문을 넣어줘야 한다.

  • 에러를 해결한 코드

접근제한자

  • 클래스, 멤버변수, 멤버 메서드 등의 선언부에서 접근 허용 범위를 지정하는 역할의 키워드
  • 접근제한자의 종류
    • public
    • protected
    • (default)
    • private
  • 그 외 제한자
    • static → 클래스 레벨의 요소 설정
    • final → 요소를 더이상 수정할 수 없게 함
    • abstract → 추상 메서드 및 추상클래스 작성

 

  • public
    • 모든 위치에서 접근 가능
  • protected
    • 같은 패키지에서 접근 가능, 다른 패키지에서 접근 불가.
    • 단, 다른 패키지의 클래스와 상속관계 있을 경우 접근 가능
  • default
    • 같은 패키지에서만 접근 가능
    • 접근 제한자가 선언이 안되었을 경우 기본값
  • private
    • 자기 자신 클래스 내에서만 접근가능

private 예시

 

  • 다른 클래스에 있으므로 private 으로 선언된 name 에 접근 불가

 

default 예시

public class Person {

	String name;
	int age;
	
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.name = "김이름";
	}
}

다른 클래스 이지만 default 접근자이므로 사용가능

protected 예시

package test02_protected;

//class 는 public 아니면 default
public class Person {

	protected String name;
	protected int age;
	
	public static void main(String[] args) {
		Person p1 = new Person();
		p1.name = "김이름";
	}
}

같은 패키지 안에 있으므로 protected 접근 가능

  • 다른 패키지 안에 있다면? protected 접근 불가!
  • 단, 상속을 받은 경우에는 사용가능.
  • 상속한 예제

test02_protected2 패키지 안의 Student 클래스는 test02_protected의 Person 클래스를 상속하고 있으므로, Student 클래스에서 Person 클래스 안의 protected String name 속성에 접근이 가능

 

getter setter

  • 접근자와 설정자
package test06_getter_setter;

public class Person { 
	
	private String name;
	private int age;
	private boolean hungry;

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public boolean isHungry() {
		return hungry;
	}
	public void setHungry(boolean hungry) {
		this.hungry = hungry;
	}
	  
}
  • 위의 멤버변수에 접근할 수 있는 통로(메서드)를 public 한 메서드로 만들어 줌
  • 값을 변경 → 설정자 setter → set + 멤버변수 이름
  • 값을 조회 → 접근자 getter → get + 멤버변수 이름

  • private 변수 이므로 9번라인은 에러 → 바로 접근할 수 없음
  • 그러나 public 으로 선언된 생성자와 접근자를 이용하면 접근가능.

(+)

public int getAge() {
		return age;
	}
	public void setAge(int age) {
		if(age<0) {
			System.out.println("나이가 음수일 수는 없어요");
		}
		if(age>200) {
			System.out.println("그렇게 오래살 수는 없어요.");
		}
		this.age = age;
	}

원하지 않는 값을 입력할 경우 콘솔창에 출력 가능.

 

싱글톤

⇒ 생성자가 여러 차례 호출하더라도 실제로 생성되는 객체는 하나이고, 최초에 생성된 생성자를 계속 리턴해서 사용하도록 하는 방식.

  • 형식예제
public class Manager {
		private static Manager manager = new Manager();

		private Manager(){}

		public static Manager getManager(){
		return manager;
		}
}

싱글톤 생성방식

  1. private으로 자기자신을 만든다. → 이때, static 사용 : 객체를 생성하지 않고 클래스 이름으로 접근하기 위함.
  2. 생성자를 private 으로 막기 → private
  3. 유일한 객체에 접근할 수 있는 통로 만들기 → public

(+ ) 추가적으로 getter 와 setter 를 만들어 줄 수 있음.

  • 싱글톤 예제 코드
package test07_singleton;

public class Person {
//1 
	private static Person instance = new Person();
	 
//2
	private Person() {
		this.name = "유일";
		this.age = 12313;
	}
	 
//3
	public static Person getInstance() {
		return instance;
	}
	
//getter, setter만들기
//먼저 private 으로 필드 생성
	private String name;
	private int age;
	  
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

  • 싱글톤으로 만들면 새로운 객체를 생성할 수 없다.

싱글톤 생성 순서 확인하기

https://22chaechae.tistory.com/57

 

싱글톤 이해하기 (with 인터페이스 사용 예제)

싱글톤 코드 구현 순서 (1) 기본생성자를 막아서 외부에서 만들 수 없게 한다 private StudentManager(){} (2) 외부에서는 생성 못하니까 나라도 만들어서 내가 가지고 있어야 한다. private StudentManager instan

22chaechae.tistory.com

 

'이론학습 > JAVA' 카테고리의 다른 글

클래스 다이어그램 아이콘  (0) 2023.01.21
자바 : JVM 메모리 구조 이해하기  (0) 2023.01.19
자바 클래스와 객체(1)  (0) 2023.01.18
자바 배열  (0) 2023.01.17
자바기초  (0) 2023.01.16