Java

09. Java - 클래스(3)_인스턴스/정적멤버

코골면서 딩가딩가 2024. 5. 10. 14:28

 

안녕하세요 잠만보입니다. 요즘 하루에 조금씩이라도 자바공부를 하는데 할 때 마다 실력이 조금씩 느는것같아서 뿌듯하고 재밌네요ㅎㅎㅎ 확실히 블로그 쓰는것도 코딩에 재미가 들린만큼 열심히 쓰다보니까 저번주에는 80명이 넘는 분들이 들어와주시고.. 저 그날 기분이 너무 좋았어요 .. (크흐흫) 아무튼 이번에도 클래스에 대해 공부할건데 열심히 해보겠습니다. 감사합니다😁😁😁

 

 

오늘은 기분이 좋으니 저는 노래들으면서 해보겠습니다.

리쌍 - 광대 (승천)

 

 

 

 

 

아참참 저번내용 기억안나시는분들은 기존에 올린글 먼저보고와주세요!

 

07. Java - 클래스_이론편

안녕하세요 코를 너무 많이 골아서 그런가 늦잠을 자서 늦게 왔습니다..😴😴😴  오늘은 클래스에 대해서 공부를 해보려고합니다. 제 꿈이 건물주인데 현실에서는 쉽지않고...  자바에서라도

mom11230.tistory.com

 

08. Java - 클래스(2)_실습편

안녕하세요 클래스 부분은 너무 길어서 한번에 다 정리해놓으면 읽다가 코골것같아서 나눠서 올리려고 합니다...! 이론이 공부안되셨거나 기억이 안나시는분들은 전 실습을 한번더 확인하고 와

mom11230.tistory.com

그럼 오늘도 시작해보겠습니다...╰(*°▽°*)╯

 

 

 

✅ 00. 인스턴스 멤버

인스턴스란?

인스턴스(instance) 멤버란 객체에 소속된 멤버를 말합니다. 필드에 메소드는 선언 방법에 따라 인스턴스 멤버와 정적 멤버로 분류할 수 있습니다.

구분 설명
인스턴스(instance) 멤버 객체를 생성해야만 사용할 수 있는 멤버
정적(static) 멤버 객체 없이도 사용할 수 있는 멤버

인스턴스 멤버 같은 경우는 저번 실습에서 사용하였듯이, 새로운 객체를 사용하여 내부객체에서 초기화하여 외부객체에서 호출을 받을 수 있게 리턴타입으로 코드를 구현해봤습니다. 이번에는 정적(static)에 대해 조금 더 깊게 공부해보겠습니다.

 

 

✅ 01. 정적(static) 멤버

정적멤버란?

정적멤버란 메소드 영역의 클래스에 고정적으로 위치하는 멤버를 말합니다. 따라서 정적 멤버는 객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능합니다.

출처 - https://superbono-2020.tistory.com/157

 

자바는 클래스 로더를 이용해서 클래스를 메소드 영역에 저장하고 사용합니다. 

 

다음 예제는 static 정적 멤버를 사용하여 정적 필드 pi 와 정적 메소드 plus(), minus()를 사용해봤다. 정적 필드와 정적 메소드는 다음과 같이 객체 참조 변수로도 접근이 가능하다.

 

 

✅ 02. 인스턴스 멤버와 정적 멤버의 차이점

정적 메소드와 정적 블록은 객체가 없어도 실행이 되는 특징 떄문에 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없으며, 객체 자신인 this도 사용할 수 없습니다.

package ch06.copy;

public class compare {
	int speed;

	void run() {
		System.out.println(speed + "으로 달립니다.");
	}

	static void simulate() {
		compare com = new compare();
		com.speed = 200;
		com.run();
	}

	public static void main(String[] args) {
		simulate();
		
		compare com = new compare();
		com.speed = 60;
		com.run();

	}
}

이번 예제를 보면 알 수 있듯이, 우선 compare라는 클래스안에 speed라는 변수 필드를 생성했습니다. 그 후에 리턴 값이 없는 void타입으로 run() 메소드를 생성했습니다. 그런 다음에 정적멤버인 static 을 사용해서 초기화값이 없이 바로 speed의 값을 입력하였고, run () 메소드를 호출할 수 있었습니다.

 

아래에 public static void main에서도 정적멤버를 사용하였기 때문에 바로 simulate라는 메소드를 호출할 수 있었습니다.

그 후 new연산자를 사용해서 또 다른 객체를 생성하고  speed의 값을 입력하였고, run () 메소드를 호출할 수 있었습니다.

 

 

 

이때부터 느낌적인 느낌으로 이해하고 있으유...🤪

 

 

✅ 03. final 필드와 상수

인스턴스 필드와 정적 필드는 마음만 먹으면 언제든지 값을 바꿀수 있습니다. 그러나 경우에 따라서는 값을 변경하는 것을 막고 읽기만 허용해야 할 때가 있는데, 이때 final 필드와 상수를 선언해서 사용합니다.

이처럼 필드(nation,ssn)는 final를 사용하였기 때문에 필드값을 읽을 때 오류가 나는것을 볼 수 있다. 그러나 name은 수정이 가능하다. 

 

수정된 f1.name의 값을 출력할 수 있게 변경했더니 이처럼 수정이 가능한 것을 볼 수 있다.

 

 

 

✅ 04. 접근 제한자

경우에 따라서는 객체의 필드를 외부에서 변경하거나 메소드를 호출할 수 없도록 막아야 하는데 다음은 접근 제한 종류를 보여준다.

접근 제한자는 public, protected, private의 세 가지 종류가 있다.

 

출처 -  Java_접근지정자(접근제한자) (velog.io)

 

※ 클래스를 선언할 때 public 접근 제한자를 생략한다면 클래스는 default 접근 제한을 가집니다. 이 경우 클래스는 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에선 사용할 수 없게 됩니다.

 

 

✅ 05. 싱글톤 패턴 

싱글톤 패턴이란?

애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤(Singleton)패턴을 적용할 수 있습니다. 

private 클래스(){}

싱글톤 패턴의 핵심은 생성자를 private로 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 합니다.

 

출처 - https://m.hanbit.co.kr/channel/category/category_view.html?cms_code=CMS4642360687

 

다음은 싱글톤 패턴을 사용하는 이유입니다. 자신이 원하는 객체들을 new 연산자를 통해 생성자를 호출할 수 있도록 할 수 있고 자신이 원하지 않는 객체에게는 호출을 할 수 없도록 하기 위해서입니다.

다음 코드에서도 볼수 있듯이, new 연산자를 사용해서 객체를 생성하려고 해도 오류가 뜬다. 그래서 오직 싱글톤패턴일때는 도트연산자(.)를 사용해서 public 접근 권한을 갖고 있는 생성자나 정적 메소드를 호출할 수 밖에 없다.

 

이처럼 접근 권한 있는 메소드를 호출하는 것이기 때문에 두 변수(s1, s2)는 동일한 객체가 된다.

 

 

우리는 같은 집에 살아요(같은 객체_실사판ㅋㅋ)

 

 

✅ 06. Getter/Setter

클래스의 getter와 setter는 데이터 은닉과 캡슐화를 위한 중요한 요소입니다. 이들은 클래스의 멤버 변수에 접근하고 수정할 수 있는 메서드를 제공합니다.

 

Getter (접근자)

Getter는 클래스의 멤버 변수의 값을 반환하는 메서드입니다. 이를 통해 외부에서 클래스의 내부 데이터에 접근할 수 있습니다. Getter 메서드는 일반적으로 인스턴스 변수의 값을 반환하는 메서드입니다. Getter 메서드의 이름은 "get"으로 시작하고 그 뒤에 변수의 이름이 옵니다.

 

Setter (설정자)

Setter는 클래스의 멤버 변수에 값을 설정하는 메서드입니다. 이를 통해 외부에서 클래스의 내부 데이터를 수정할 수 있습니다. Setter 메서드는 인스턴스 변수의 값을 설정하기 위한 메서드입니다. Setter 메서드의 이름은 "set"으로 시작하고 그 뒤에 변수의 이름이 옵니다.

 

이것으로 클래스 공부끝!!!!!!!!!!!!!!!!!!!

 

 

※ 추가로 개꿀팁 (나만몰랐던 ㅋㅋ)

이제까지 맨날 getter/setter 메소드 직접 하나하나씩 다치고있었던 나 반성해.... 이클립스에서는 클래스에 선언된 필드에 대해 자동으로 생성할 수 있었어... [Source] - [Generate Getters and Setters]를 선택하면 선언된 필드에 대해 자동으로 생성할 수 있는 대화상자가 뜹니다..... (왜 아무도 안알려준거야...(또르륵))