09. Java - 클래스(3)_인스턴스/정적멤버
안녕하세요 잠만보입니다. 요즘 하루에 조금씩이라도 자바공부를 하는데 할 때 마다 실력이 조금씩 느는것같아서 뿌듯하고 재밌네요ㅎㅎㅎ 확실히 블로그 쓰는것도 코딩에 재미가 들린만큼 열심히 쓰다보니까 저번주에는 80명이 넘는 분들이 들어와주시고.. 저 그날 기분이 너무 좋았어요 .. (크흐흫) 아무튼 이번에도 클래스에 대해 공부할건데 열심히 해보겠습니다. 감사합니다😁😁😁
오늘은 기분이 좋으니 저는 노래들으면서 해보겠습니다.
아참참 저번내용 기억안나시는분들은 기존에 올린글 먼저보고와주세요!
07. Java - 클래스_이론편
안녕하세요 코를 너무 많이 골아서 그런가 늦잠을 자서 늦게 왔습니다..😴😴😴 오늘은 클래스에 대해서 공부를 해보려고합니다. 제 꿈이 건물주인데 현실에서는 쉽지않고... 자바에서라도
mom11230.tistory.com
08. Java - 클래스(2)_실습편
안녕하세요 클래스 부분은 너무 길어서 한번에 다 정리해놓으면 읽다가 코골것같아서 나눠서 올리려고 합니다...! 이론이 공부안되셨거나 기억이 안나시는분들은 전 실습을 한번더 확인하고 와
mom11230.tistory.com
그럼 오늘도 시작해보겠습니다...╰(*°▽°*)╯
✅ 00. 인스턴스 멤버
인스턴스란?
인스턴스(instance) 멤버란 객체에 소속된 멤버를 말합니다. 필드에 메소드는 선언 방법에 따라 인스턴스 멤버와 정적 멤버로 분류할 수 있습니다.
구분 | 설명 |
인스턴스(instance) 멤버 | 객체를 생성해야만 사용할 수 있는 멤버 |
정적(static) 멤버 | 객체 없이도 사용할 수 있는 멤버 |
인스턴스 멤버 같은 경우는 저번 실습에서 사용하였듯이, 새로운 객체를 사용하여 내부객체에서 초기화하여 외부객체에서 호출을 받을 수 있게 리턴타입으로 코드를 구현해봤습니다. 이번에는 정적(static)에 대해 조금 더 깊게 공부해보겠습니다.
✅ 01. 정적(static) 멤버
정적멤버란?
정적멤버란 메소드 영역의 클래스에 고정적으로 위치하는 멤버를 말합니다. 따라서 정적 멤버는 객체를 생성할 필요 없이 클래스를 통해 바로 사용이 가능합니다.
자바는 클래스 로더를 이용해서 클래스를 메소드 영역에 저장하고 사용합니다.
다음 예제는 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의 세 가지 종류가 있다.
※ 클래스를 선언할 때 public 접근 제한자를 생략한다면 클래스는 default 접근 제한을 가집니다. 이 경우 클래스는 같은 패키지에서는 아무런 제한 없이 사용할 수 있지만 다른 패키지에선 사용할 수 없게 됩니다.
✅ 05. 싱글톤 패턴
싱글톤 패턴이란?
애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤(Singleton)패턴을 적용할 수 있습니다.
private 클래스(){}
싱글톤 패턴의 핵심은 생성자를 private로 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 합니다.
다음은 싱글톤 패턴을 사용하는 이유입니다. 자신이 원하는 객체들을 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]를 선택하면 선언된 필드에 대해 자동으로 생성할 수 있는 대화상자가 뜹니다..... (왜 아무도 안알려준거야...(또르륵))