티스토리 뷰
1.계획
혼공자 chapter 6-3 ~ 6-6
공식문서 참조
2.배운점
자바에서의 설계도는 class
클래스는 객체를 생성하기 위한 필드 메소드가 정의되어있다.
클래스로 부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다.
그리고 클래스로부터 객체를 만드는 과정을 인스턴스화라고 한다.
public class carMethod {
int gas; // 필드
public void setGas(int gas) {this.gas = gas;} // 반환값이 없는 필드에 값을
// 전달하기위한 메소드
Boolean isGasLeft(){
if(gas == 0) {
System.out.println("gas가 없습니다.");
return false;
} else {
System.out.println("gas가 있습니다");
return true;
}
} // 확인을 위한 메서드
void run(){
while(true) {
if(gas > 0 ) {
System.out.println("차가 달립니다. 가스 잔량: "+gas);
gas -= 1;
} else {
System.out.println("가스가 없어요.. 가스 잔량: "+gas);
return;
}
}
} // 메소드
public static void main(String[] args) {
carMethod c1 = new carMethod();
// carMethod클래스 타입으로 인스턴스를 만들어서 c1의 변수에 할당 <- 인스턴스화
}
}
필드
- 필드는 객체의 고유 데이터, 부품 객체, 상태 정보를 저장하는 곳이다. 선언하는 형태는 변수를 선언할때와 비슷하지만
변수라고 부르지 않는다. 변수는 생성자와 메소드에서 사용되고 실행이 종료되는 시점에 사라진다.
하지만 필드는 생성자와 메소드 전체에서 사용되며 객체 즉 클래스가 사라지지않는 이상 존재한다.
생성자
- 생성자는 new 연산자로 호출되는 특별한 중괄호{} 블럭이다. 생성자의 역할은 객체 생성 시 초기화를 담당함
이때 클래스에서 선언한 매개변수에 따라서 초기화할 내용이 달라질 수 있다. 생성자는 메소드와 비슷하게 생겼지만
클래스와 동일한 이름을 갖고있고 리턴타입이 없다.
메소드
- 메소드는 객체의 동작에 해당하는 중괄호{} 블럭을 말한다. 메소드를 호출하게 되면 일시적으로 메소드안에 있는 코드들이 실행되고 사라진다. 이 메소드는 중괄호 블럭 내부 로직을 외부로 출력할수도, return해줄 수 있다.
인스턴스 멤버 와 정적 멤버
- 인스턴스 멤버는 객체마다 가지고 있는 멤버를 말하고,
정적 멤버는 클래스에 위치해서 객체들이 공유하는 멤버를 말한다.
인스턴스 멤버: 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데 이들을 각각 인스턴스 멤버,
인스턴스 메소드라고 부른다.
this
객체 외부에서 인스턴스 멤버를 사용하기 위해 참조 변수를 이용하는 것과 마찬가지로 객체 내부에서도 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있다.
carMethod c1 = new carMethod();
c1.setGas(13);
int gas; // 필드
public void setGas(int gas) {
this.gas = gas;
}
객체를 생성하고 gas의 값을 저장하기 위해 setGas를 사용했는데 이때
int gas에 값을 넣기위해서 setGas 메소드 호출 중괄호에
매개변수로 들어오는 가스는 우측에 들어와서 this.gas < 이것은 위에 필드로 선언한 gas로 값이 입력된다.
정적 멤버와 static
정적은 '고정된'이란 의미라고 한다 정적 멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 말한다. 이들을 각각 정적 필드, 정적 메소드 라고 부른다.
정적 멤버 선언
정적 필드와 정적 메소드를 선언하려면 선언 시 타입 이전에 static을 붙이면 된다.
static double pi = 3.141592;
System.out.println(carMethod.pii);
그래서 언제 인스턴스나 정적으로 선언할건지가 중요해보인다.
이에 대한 구분 방법으로 해당 클래스에서 내부 클래스를 포함하고 있다면 인스턴스 멤버
포함하지 않으면 정적으로 선언해주면 된다고 생각한다.
+ 클래스가 메모리로 로딩되면 정적 멤버, 정적 메소드들은 사용할 수 있을듯하다
주의할점
객체를 생성하지 않아도 실행할 수 있는데 이 정적 멤버를 클래스 내부에서 인스턴스 멤버와 혹은 인스턴스 메소드와 사용하게된다면 에러가 발생할 수 있다는점..!
정적 메소드에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 사용해야 한다.
싱글톤
전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있는데,
하나만 생성된다고 해서 이 객체를 싱글톤(Singleton)이라고 한다.
싱글톤을 만드려면 외부에서 new 연산자로 생성하는걸 막아야한다.
이때 생성자에 private라는 접근 제어자를 붙여 외부에서 필드값 변경을 막으면 된다.
private programing() {}
그리고 자기의 타입인 private 타입으로 객체 생성을 하면 된다고 한다.
private static programing singleton = new programing();
그리고 getInstance 메소드를 정의해서 singleton 객체를 리턴하도록 써주면 되겠다.
(외부에서 호출하기 위해)
static programing1 getInstance(){
return singleton;
}
호출하는 방법은 아래와 같다
해당 클래스를 쓰고 위에서 정의한 정적 메소드 즉 getInstance를 사용해주면 된다!
programing1 p1 = programing1.getInstance();
3.코멘트
class.. 클래스는 상당히 추상적인 느낌이다.
클래스라는걸 설계도라고 표현 그 안에것들의 생성자(초기화 및 값 세팅) 필드 메소드(동작)들
사용되는것들의 의미를 이해한다는것은 어려운거같다
프로그래밍에서의 약속과 이해를 구분해서 내가 이해해야할 부분은 정확히 이해하면서
외워야할것들은 외워야한다니!(사실 구글링하면 다 나온다.)
내일은 알고리즘 시험을 보는데 잘 풀수있으면 좋겠다는 말로 오늘은 마무리!
- Total
- Today
- Yesterday
- ssl
- EntitiyManagerFactory
- 풀텍스트
- joinfetch
- python
- instance
- badrequest
- backoffice
- ajax
- 알고리즘
- method
- POI
- java
- 환경세팅
- IOC
- 협업
- 김영한
- DI
- .jks
- 항해99
- JPQL
- EC2
- wil
- Spring
- DTO
- 코드해석
- querydsl
- JWT토큰
- this
- JPA
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |