티스토리 뷰

Language/JAVA

일곱째날 [클래스(2)]

구일일구 2022. 7. 29. 20:19
반응형

목차

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이 붙은 String maker는 힙 메모리가 아닌 메소드 영역에 저장되어 있다 : 힙에서 가져와 쓸 수 있다.

[메인메소드 : 메소드 영역 / 따로 만든 클래스 안의 변수를/ 사용하기 위해 만든 메모리 는 서로 다른 영역에 있기 때문에 객체를 생성한 후 접근 가능하다.] [ 변수에 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
댓글