멤버 변수에 직접 값을 대입하는 것
-> 통제 불가 : 사용을 지양
-> 접근제어자를 통해 통제
멤버 변수의 접근 제어자
-> private, protected...
근데 변수를 쓸려고 선언한건데 막아버리면 쓰질 못하니 통제가능한 수단(함수)을 활용해서 변수를 사용하자
멤버 변수의 값을 확인(조회)할 수 있는 접근 가능한 메서드 추가
-> get
변수의 값을 지정할 수 있는 접근 가능한 메서드 추가
-> set
변수에 값 직접 대입하지 못하게 통제하는 역할
1) public
2) protected
3) default(기본값)
4) private
public > protected > default > private
적용범위: 클래스명, 변수, 메서드
예시)

ㄴ 2월에는 31일이 없는데 기입되네..이러면 안되는데
ㄴ 통제가 안된다
ㄴ 변수에 직접대입 지양하자

ㄴ private으로 통제시킴
예시)

다른 패키지면 패키지명 포함해서 써줘야 ㄹㅇ클래스명임
벗 같은 패키지면 생략 가능

근데 이거 너무 길어
import를 쓰자ㅏㅏ
import 패키지명.클래스명;예시)

ㄴ import쓰면 앞에 패키지명 안써도 ㅇㅋ
예시) import 자동설정
import도 귀찮아
자동으로 import해주는 기능 설정하자


ㄴ add : 쓰고 있는 import알아서 추가(단, 애매하지 않고 확실할때만 추가)
ㄴ optimize : 안쓰는 import알아서 삭제
예시) * : 해당 패키지에 있는 모든 클래스 import하겠다


동일 패키지

외부 패키지

ㄴ 외부패키지 클래스 외부에선 접근x





ㄴ 같은 패키지만 가능
{} 내에서만 가능예시)

ㄴ 클래스 내부의 범위


예시) 호출하려면 private이 있는 메서드 내부에서 함수정의하고 외부에서 함수를 호출해서 출력하는 방법


참고) 하위패키지는 다른패키지이다
멤버 변수의 값을 확인(조회)할 수 있는 접근 가능한 메서드 추가
ex) get멤버변수명()
변수의 값을 지정할 수 있는 접근 가능한 메서드 추가
ex) set멤버변수명(...)
예시)

ㄴ set변수명으로 함수이름 설정하는 것이 관례

ㄴ if문 써서 변수 값 통제함

ㄴ get변수명으로 함수이름 설정하는 것이 관례


ㄴ month값만 나오게끔 출력 완
참고) get, set 자동완성
마우스 우클릭
예시)
package exam01;
public class Schedule {
private int year;
private int month;
private int day;
public Schedule() {
this(2024, 4, 17);
}
public Schedule(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
if (this.month == 2 && day > 28) {
day = 28;
}
this.day = day;
}
public void showDate() {
System.out.printf("year=%d, month=%d, day=%d%n", year, month, day);
printThis(); // this.printThis()
}
public void printThis() {
System.out.println(this);
}
public Schedule returnThis() {
return this;
}
@Override
public String toString() {
return "Schedule{" +
"year=" + year +
", month=" + month +
", day=" + day +
'}';
}
}

ㄴ this는 schedule이라는 객체의 주소값이다

ㄴ this의 주소값과 s1의 주소값이 같다

ㄴ this가 안보이지만 생략되어 있는 상태이다(지금은 설명을 위해 표시함)
ㄴ 멤버변수가 어디의 멤버변수인지 명확하다면 this 생략해도 된다

ㄴ 벗 this가 애매할때는 생략 불가
ㄴ 위 예시에서 year가 지역변수의 year인지 멤버변수의 year인지 모호하기 때문에 this를 생략불가
ㄴ this.year = 멤버변수(인스턴스 변수, 힙에 있는 변수), 객체의 자원
예시)



ㄴ 오류뜨는거는 기본생성자 함수 추가해서 그거 참조하게끔 해가지고 오류해결


ㄴ this가 첫줄이 아니면 오류 뜸

참고)
객체의 주소값 16진수로 표현하면 좀 더 짧게 표현 가능
예시)
id는 이미 클래스로더에 올라갔을 때 부터 공간을 할당받아 변수이기 때문에 힙에 공간을 만들지 않음
name, subject는 아직 변수가 못됬기 때문에 생성자 함수가 힙에서 공간을 만들어줌

Student s1, Student s2가 id에 접근할 때는 동일한 자원에 접근한다

그래서 id값이 1001로 동일하게 나옴

this의 목적은 객체의 자원 접근


반대로 instance메서드는 정적자원 접근 가능
객체가 생성된 이후 의 메서드 이기 때문에 이미 정적자원이 있을 시점이니까 접근가능
하지만 static메서드는 동적자원 접근 불가
왜냐면 아직 동적자원에 객체가 생성이 안되어 있기때문에 접근할 자원이 없음

ㄴ 함수는 기능이 똑같으니 모든객체가 공유할 수 있게 데이터 영역에 넣자
ㄴ 굳이 똑같은기능하는데 계속 만들어지지 않게끔 데이터 영역에 넣자
ㄴ 값만 바궈주면 되니 값은 힙 영역
참고) 편의기능
java.lang.Math: 수학 관련 편의 기능 모음 클래스
java.util.Arrays: 배열을 다룰 때 사용할 수 있는 편의 기능 모음 클래스
편의기능 클래스의 경우는 객체를 여러개 생성할 필요x
-> 매서드나 변수 상수를 static으로 정의한 경우가 많다
-> 문제점?
static : 처음부터 공간 할당, 활성화 -> 사용하지 않아도 이미 메모리를 차지하는 문제가 있다
-> 싱글톤 패턴으로 해결
1) 기능을 담당하는 객체는 여러개 만들 필요x
2) 이 기능이 항상 필요하지않으니 필요할 때만 객체 생성
3) 객체는 필요할 때 하나만 생성하고 공유
1) 생성자를 외부에서 직접 호출x, 접근 제어자 private 변경
2) 클래스 내부에서 정적 변수(static)로 선언
3) 클래스 내부에서 생성된 객체를 반환하는 정적 함수(static)
4) 동시성 작업 : 동기화 처리
static {
// 클래스가 로드 되는 시점부터 실행
// 객체가 생성하지 않아도 실행
}


