티스토리 뷰
목차
9.인스턴스 멤버와 this
10. 정적 멤버와 static
11. final 필드와 상수
12. 패키지
13. 접근 제한자
14. Getter와 Setter 메소드
[9] 인스턴스 멤버와 this
* 인스턴스 멤버 : 객체(인스턴스)마다 가지고 있는 필드와 메소드. 클래스의 구성요소.
- 객체 소속된 멤버이기 때문에 객체가 없이 사용 불가함. 힙이라는 메모리 안에 올라가있는 것들을 '인스턴스 멤버'라고 한다.
* this.
- this가 변수, 메소드, 생성자 안에서 '내 메모리에 있는 이거!'를 사용하기 위해 쓰는 것
- 객체(인스턴스) 자신의 주소를 가지고 잇는 키워드
- 객체 내부에서 인스턴스 멤버임을 명확히 하기 위해 this. 사용
- 구분되는 상황에선 this를 쓸필요가 없음
- model = m, setspeed = s로 한다면, 이름이 다르기 때문에 굳이 같이 쓸필요 없다
public class Car{
//필드
String model;
int speed;
//생성자
Car(String model){
this.model = model;
}
//메소드
void setSpeed(int speed){
this.speed = speed;
}
void run(){
for(int i=10; i<=50; i+=10){
this.setSpeed(i);
System.out.println(this.model + "가 달립니다.(시속:" + this.speed + "km/h)");
}
}
}
[10] 정적 멤버와 static
* 정적 멤버
public class 클래스{
//정적 필드
static 타입 필드 [=초기값];
//정적 메소드
static 리턴 타입 메소드(매개변수선언, ...) {...}
}
- static 키워드가 붙은 변수, 메소드를 정적 필드, 정적 메소드라 부른다.
- 클래스에 고정된 필드와 메소드 : 정적 필드, 정적 메소드
- 클래스에 소속된 멤버 : 객체 내부에 존재하지 않음 (힙 메모리에 없음), 메소드 영역에 존재함
- 객체를 생성하지 않고 클래스에 바로 접근해 사용 가능함
ex) Math.random() : Math라는 클래스도 존재하지만, 우리는 math 클래스를 새로 생성한 적이 없다. random()이라는 메소드는 static 이 붙어있는 칭구이기 때문에, 객체를 생성해서 접근하지 안항도 됨. static이 붙은 것들은 컴파일이 되면서 자동으로 메소드 영역에 올라간다. 다만 메모리에 접근하기 위해선, 클래스의 이름이 필요함.
ex)System.out.print() : System도 클래스. static이 붙어있는 out이 정해져있음. 그래서 객체 새로 생성 필요X
- static이 붙은 메소드들은 '공유'한다는 의미 : 모든 클래스에서 다 쓸 수 있도록
- static 안붙은 애들은 객체 생성해야 함. 붙은 애들은 객체 생성 X
- 객체를 생성해서 따로따로 사용하고 싶을때엔 힙메모리에 올려놓고 쓰기
- static이 붙은 애는 영역이 하나 딱! 만들어져서 한번만 만들어서 밑에 객체애들이 공유할 수 있도록 만듬니다
[메인메소드 : 메소드 영역 / 따로 만든 클래스 안의 변수를/ 사용하기 위해 만든 메모리 는 서로 다른 영역에 있기 때문에 객체를 생성한 후 접근 가능하다.] [ 변수에 static이 붙으면 같이 사용할 수 있다. ] : 접근성!!! 에 관한 것
* 정적 멤버 사용 : 클래스 이름과 함께 '.' 연산자로 접근 가능
클래스.필드;
클래스.메소드(매개값, ...);
//Caloculator는 static이 붙었기 때문에, 같은 클래스에서 사용을 하면, 같은 클래스 영역에 저장됨 : 클래스 이름 빼고서도 접근 가능
- 공유라는 개념이 들어가는 순간 static이 붙어야 한다.
- 어떻게 활용하나에 따라서 중요도가 다름 : 내 프로젝트에 사용할 변수들을 static 에 만들고, 다른 클래스에서 그 변수들을 가져다가 사용할 수도 있다.
✅ static이 붙은 필드, 메소드를 만들면 객체생성이 필요없다.
* 인스턴스 멤버 선언 vs 정적 멤버 선언의 기준
- 인스턴스 필드 : 객체마다 가지고 있어야 할 데이터
- 정적 필드 : 공용적인 데이터
- 인스턴스 메소드 : 인스턴스 필드로 작업해야 할 메소드
- 정적 메소드 : 인스턴스 필드로 작업하지 않는 메소드
* 정적 초기화 블록
- 클래스가 메소드 영역으로 로딩될 때 자동으로 실행하는 블록
- 정적 필드의 복잡한 초기화 작업과 정적 메소드 호출 가능
- 클래스 내부에 여러 개가 선언되면 순서대로 실행됨
- 프로젝트 할 때, 메모리 상에 제일 먼저 로딩됐으면 하는 것들을 static 붙여서 사용하면 됨
- instance라는 애들은 객체를 생성해야 접근 가능하기 때문. 생성하지 않으면 아예 접근 불가능하다.
static String company = "Samsung";
static String model = "LCD";
static String info;
static{
info = company + "-" + model;
}
info 필드는 정적 블록에서 company와 model 필드값을 서로 연결해서 초기값으로 설정함
* 정적 메소드와 정적 블록 작성시 주의할 점
- 객체가 없어도 실행 가능
- 블록 내부에 인스턴스 필드나 인스턴스 메소드 사용 불가 : 힙 메모리 에서만 필요한 것들
- 객체 자신의 참조인 this() 사용 불가 : 힙 메모리에서만 필요한 것들
//인스턴스 필드와 메소드
int field1;
void method1(){...}
//정적 필드와 메소드
static int field2;
static void method2(){...}
//정적 블록
static{
field1 = 10; (x)
method1(); (x)
field2 = 10; (o)
method2(); (o)
}
//정적 메소드
static void Method3{
this.field1 = 10; (x)
this.method1(); (x)
field2 = 10; (o)
method2(); (o)
}
* 싱글톤 : 하나의 애플리케이션 내에서 단 하나만 생성되는 객체
(가끔 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우가 있다. 단 하나만 생성된다고 해서 이 객체를 싱글톤이라고 한다. 싱글톤을 만들려면 클래스 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아야 한다. 생성자를 호출한 만큼 객체가 생성되기 때문이다.)
- 클래스 하나 당 객체는 여러개 생성 가능하다.
- 싱글톤은 오직 객체 하나만 생성해 놓고 다른 데에서 사용할 수 있도록 한다 : 공유의 개념
public class 클래스{
//정적 필드
private static 클래스 singleton = new 클래스();
//생성자
private 클래스(){}
//정적 메소드
static 클래스 getInstance(){
return singleton;
}
}
* 싱글톤을 만드는 방법
- private 접근 제한자를 생성자 앞에 붙임 : 외부에서 new 연산자로 생성자를 호출할 수 없도록 막기
- 클래스 자신의 타입으로 정적 필드 선언 : 자신의 객체를 생성해 초기화 / private 접근 제한자 붙여 외부에서 필드 값 변경 불가
- 외부에서 호출할 수 있는 정적 메소드인 getInstance() 선언 : 정적 필드에서 참조하고 있는 자신의 객체 리턴
- 객체 하나만 만들어놓고 돌려쓰기 위해 싱글톤을 만든다
[11] final 필드와 상수
* final 필드 : 최종적인 값을 갖고 있는 필드 = 값을 변경할 수 없는 필드, 수정할 수 없음 = 마지막이다
- final 필드에 값을 넣어놓지 않고 기본값 설정을 안해놓으면, 한번만 값을 바꿀 수 있다.
- final은 자주 쓰진 않음
final 타입 필드 [=초기값];
* 상수 (static final)
static final 타입 상수 [=초기값];
- 기억하기
- 상수 = 정적 final 필드
- 값을 바꿀 순 없다
- 공용 데이터로서 사용한다
- 객체마다 필요하진 않고, 메소드 영역에 올라가서 클래스별로 관리되는 공용데이터
- 전부 대문자로 작성
- 다른 단어가 결합되면 _로 연결
- 상수는 public 붙여야함
- final과 static 자리 바꾸기도 가능
[12] 패키지
* 패키지
- 유사 기능끼리 묶어놓은 것
- 웹쪽으로 가면, 회원관리, 상품관리 등을 나눌 때 사용할 것
- 클래스를 기능별로 묶어서 그룹 이름을 붙여놓은 것 : 폴더와 비슷한 개념
- 패키지의 물리적인 형태는 파일 시스템의 폴더
- 클래스 이름의 일부 : 클래스를 유일하게 만들어주는 식별자
- 전체 클래스 이름 = 상위패키지.하위패키지.클래스
- 클래스명이 같아도 패키지명이 다르면 다른 클래스로 취급
- 패키지 안에 패키지를 만들고 싶다면, 현재 패키지 뒤에 .찍고 새로운 패키지명 쓰면 됨
- 클래스를 만들 때 패키지 결정 : 클래스 파일은 선언된 패키지와 동일한 폴더 안에서만 동작 (컴파일이 패키지안에서 된 것이기 때문)
* import 문
- 패키지 내에 같이 포함된 클래스 간 클래스 이름으로 사용 가능
- 패키지가 다른 클래스를 사용해야 할 경우 : import문으로 패키지를 지정하고 사용 / 패키지명이 포함된 전체 클래스 이름으로 사용
- 클래스이름 생략하고 대신 * 를 사용해서 import문 작성 : *는 패키지에 속하는 모든 클래스들을 의미함
- command + shift + O
[13] 접근 제한자
* 접근제한자 : 클래스 및 클래스의 구성 멤버에 대한 접근을 제한하는 역할
- 클래스 제한 : 다른 패키지에서 클래스를 사용하지 못하도록
- 생성자 제한
- 필드와 메소드 제한
* 종류
- public : 대부분의 클래스에서 붙임. 가장 많이 쓰임
- protected : 동일패키지에선 접근O / 다른 패키지에서 상속관계만 접근가능
- default : default는 아무것도 안붙어있는 경우를 말함 / 동일패키지에서만 접근O
- private : 같은 패키지에 다른 클래스도 접근 불가능. 아무것도 접근 불가능. 만들어진 클래스에서만 사용 가능 (변수들에 접근 불가능하도록 만듦)
* 클래스의 접근제한
* 생성자의 접근 제한 : public, protected, default, private 접근 제한을 가질 수 있음
* 필드 & 메소드의 접근 제한 : public, protected, default, private 접근 제한을 가질 수 있음
//필드 선언
[public | protected | private] [static] 타입 필드;
//메소드 선언
[public | protected | private] [static] 리턴 타입 메소드(...) {...}
[14] Getter와 Setter 메소드
클래스를 선언할 때 일반적으로 필드는 private 접근 제한을 사용 : 다른 곳에서 변수를 바꾸지 못하게
메소드를 통해서 데이터를 변경하는 방법을 선호 : 데이터는 외부에서 접근할 수 없도록, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도하는 것 : 메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문
- 읽기 전용 필드가 있을 수 있음 : Getter 필요함
- 외부에서 엉뚱한 값으로 변경할 수 없도록 : Setter 필요함
* Getter
- private 필드의 값을 리턴하는 역할 : 필요할 경우 필드 값 수정
- getFieldName() 또는 isFieldName() 메소드 사용 (필드 타입이 boolean일 경우, isFieldName()사용)
* Setter
- 외부에서 주어진 값을 필드 값으로 수정
- 필요할 경우 외부값을 유효성 검사
- setFieldName(타입 변수) 메소드
- 매개 변수 타입은 필드의 타입과 동일함
* Get, Set 자동완성 방법
- source > generate Getters and Setters > Get, Set 자동 완성
- DB 만들때, 변수 만들고 자동완성 쓰는 편이 좋음 : 오타 많이 나기 때문에.
//필드
private int speed;
private boolean stop; //기본값 false
//생성자
//메소드
public int getSpeed() { //get : 읽기
return speed;
}
public void setSpeed(int speed) { //set : 변수값 수정
if(speed<0) {
this.speed = 0; //speed가 0보다 작으면 0으로 만들어라.
return; //종료
} else
this.speed = speed; //speed가 0보다 크다면 speed에 넣어라.
}
public boolean isStop() { //is = get . boolean이기 때문에 is로 씀
return stop;
}
public void setStop(boolean stop) {
this.stop = stop;
this.speed = 0;
}
[15] 어노테이션 : 자바 기초 다 본 후, 스프링 나갈 때 쯤 공부하기로 함!~
'Language > JAVA' 카테고리의 다른 글
Chapter1. 자바 시작하기 (0) | 2022.08.02 |
---|---|
여덟째날 [상속 (1)] (0) | 2022.08.01 |
여섯째날 [클래스(1)] (0) | 2022.07.28 |
다섯째날[참조 타입] (0) | 2022.07.27 |
키 코드 (0) | 2022.07.27 |
- Total
- Today
- Yesterday
- 자료형
- 리스트
- Math 클래스
- Arrays 클래스
- Objects 클래스
- 딕셔너리
- 파이썬
- python
- Calendar 클래스
- StringBuilder 클래스
- Format 클래스
- Pattern 클래스
- 스레드 스케줄링
- 포장 클래스
- 기본 API 클래스
- 함수
- StringBuffer 클래스
- 프로그램
- Date 클래스
- 문자열함수
- Random 클래스
- java.time.package
- 순환할당
- StringTokenizer 클래스
- 요소선택
- 리스트연산자
- FALSE
- not_in
- IndexError
- 역반복문
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |