일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 리눅스환경
- dbeaver
- 도커
- 모래시계출력
- name=springapplication
- 포트포워딩
- 브로드캐스트
- 네트워크모델
- SpringApplication
- 백준
- 백준1946
- 포트포워딩 안될때
- 리눅스계열
- 도커권한설정
- wan
- 배열최소값최대값
- 페이로드
- jmx
- instancenotfoundexception
- ubuntu
- docker
- 배열빈도수
- 우분투
- 유니캐스트
- Decapsulation
- javax.management.instancenotfoundexception: org.springframework.boot:type=admin
- 오름차순
- springboot
- 디비버
- 배열복사
- Today
- Total
다잘하고싶어
자바 클래스와 객체(2) 본문
패키지
- 프로그램의 많은 클래스를 관리하기 위해서 패키지를 이용
- 패키지의 구분은 .(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;
}
}
싱글톤 생성방식
- private으로 자기자신을 만든다. → 이때, static 사용 : 객체를 생성하지 않고 클래스 이름으로 접근하기 위함.
- 생성자를 private 으로 막기 → private
- 유일한 객체에 접근할 수 있는 통로 만들기 → 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 |