인스턴스 멤버
인스턴스멤버: 객체로 만들어진 자신만의 속성을 가지고 있는 멤버
객체를 생성한 후 사용할 수 있는 필드와 메소드를 말하는데 이를 각각 인스턴스 필드, 인스턴스메소드라고 부른다.
this: 자기 자신의 영역을 동적표현으로 표현할 때 , 객체 외부에서 인스터스멤버에 접근하기 위해 참좊변수를 사용하는 것과 마찬가지로 객체 내부에서도 인스턴스 멤버에 접근하기위해 this를 사용할 수있다.
인스턴스 멤버와 this
실행 클래스
package chapter06.sec05.exam01;
// 인스턴스 멤버(필드, 메서드)와 this(자기 자신 객체의미)를 이해하기 위한 Car 클래스를 생성
public class Car {
//필드(Field) 선언
String model;
int speed;
// 생성자(Constructor)
// Source - Generate Constructor Using Fields... 클릭 활용
//public 접근제어자, 생략가능
public Car(String model) {
this.model = model;
}
//메서드(Method)
// // Source - Generate Getter and Setters... 클릭활용
public void setSpeed(int speed) {
this.speed = speed;
}
void run() {
for (int i = 10; i <= 50; i+= 10) {
//this = Car class
this.setSpeed(i);
System.out.println(this.model + "가 달립니다! (시속 = " + this.speed +"km/h)");
}
}
}
package chapter06.sec05.exam01;
// 앞서 생성한 Car 클래스를 활용하는 CarExample 실행 클래스를 소스 코딩합니다.
public class CarExample {
public static void main(String[] args) {
//myCar 참조객체이자 인스턴스 객체이다.
Car myCar = new Car("포르쉐");
myCar.run();
Car yourCar = new Car("벤츠");
yourCar.run();
}
}
정적멤버: 클래스에 위치하고 객체들이 공유하는 멤버
정적은 고정된 이란 의미 정적멤버는 클래스에 고정된 멤버로서 객체를 생성하지 않고 사용할 수 있는 필드와 메소드
메소드 메모리 영역에 적재할 떄 클래스별로 관리된다. 따라서 클래스의 로딩이 끝나면 바로 사용 가능.
** static을 붙이면 프로그램이 구동될때 메모리영역에 올라간다.
장점은 언제든지 갖다쓰기가 용이하다.
단점은 static 을 붙이면 프로그램이 구동될때 메모리영역에 올라가기때문에 메모리에 부화가 걸리고 프로그램이 무거워지기 때문에 느려지게 된다. 퍼포먼스에 안좋은 영향을 줄 수 있음
어쩔 수 없이 사용하게 된다면 최소화해야한다. 대체로 함수형 프로그램을 사용해야한다.
정적 멤버 사용
변수 앞에 static을 붙이면 outline 에 s 가 붙은걸 볼 수 있다.
실행 클래스 생성
정적멤버를 클래스이름으로 접근하지 않고 객체 참조 변수로 접근했을 경우 노란색 경고가 나타난다.
경고만 나올 뿐 실행 결과는 같다.
정적 메소드(Static Method)는 객체가 아닌 클래스 자체에 속하는 메소드입니다. 정적 메소드는 클래스 레벨에서 호출되며, 객체의 상태에 의존하지 않는 독립적인 기능을 구현할 때 주로 사용됩니다. 정적 메소드를 선언할 때 주의해야 할 몇 가지 사항이 있습니다:
인스턴스 변수와 메소드에 접근 불가능: 정적 메소드는 객체의 상태에 접근할 수 없습니다. 따라서 정적 메소드 내부에서는 인스턴스 변수나 인스턴스 메소드를 직접 사용할 수 없습니다.
this 키워드 사용 불가능: 정적 메소드는 클래스 레벨에서 호출되기 때문에 this 키워드를 사용할 수 없습니다. this는 인스턴스 자신을 참조하는데 사용되므로, 정적 메소드에서는 사용할 수 없습니다.
정적 메소드 내부에서 다른 정적 메소드 호출: 정적 메소드 내부에서 다른 정적 메소드를 호출할 수 있습니다. 하지만 이때 호출되는 정적 메소드도 마찬가지로 위의 규칙을 따라야 합니다.
정적 메소드는 상속되지 않음: 하위 클래스에서 정적 메소드를 오버라이드할 수 없습니다. 정적 메소드는 클래스의 구현과 관련된 것이 아니라 클래스 자체에 속하므로, 하위 클래스에서 재정의되지 않습니다.
정적 메소드는 클래스 이름으로 직접 호출: 인스턴스를 생성하지 않고도 클래스 이름을 통해 정적 메소드를 호출할 수 있습니다. 예를 들어, ClassName.staticMethod()와 같이 호출합니다.
정적 메소드 내에서 인스턴스 생성 불가능: 정적 메소드 내부에서는 인스턴스를 생성할 수 없습니다. 인스턴스 생성은 객체의 상태를 가지는 것이므로 정적 메소드에서는 허용되지 않습니다.
정적 메소드의 가용성과 범위: 정적 메소드는 해당 클래스가 로드되고 메모리에 적재될 때 사용 가능해집니다. 정적 메소드는 해당 클래스의 모든 객체와 관련없이 클래스 이름을 통해 호출 가능합니다.
정적 메소드 선언시 주의할점
package chapter06.sec05.exam03;
// 정적(static) 메서드(method) 선언(declaration) 시 주의할 점 이해를 위해
// Car 클래스를 코딩합니다.
public class Car {
int speed; // instance member field speed 선언
// 인스턴스 멤버 메서드 run() 선언
void run() {
System.out.println(speed + "으로 달립니다.");
}
public static void main(String[] arges) {
// speed = 60;
// run();
Car myCar = new Car();
myCar.speed = 60;
myCar.run(); //60으로 달립니다.
}
}
싱글톤
하나의 형식을 변경하고 싶지 않을 때 (일관성있고, 재사용이 편리한) 패턴을 만들 때 필요.
private 접근 제한자를 붙여 외부에서 필드값을 변경하지 못하도록 한다.
대신 외부에서 호출할 수 있는 정적 메소드 getInstance()을 선언하고 정적 필드에서 참조하고 있는 자신의 객체를 리턴해준다.
싱글톤
실행클래스 생성
package chapter06.sec05.exam04;
// 싱글톤 패턴(singleton pattern) 이해를 위해 Singleton 클래스를 선언합니다.
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton() {
System.out.println("싱글톤 생성자가 만들어졌습니다!");
}
static Singleton getInstance() {
return singleton;
}
}
package chapter06.sec05.exam04;
// 앞서 생성한 싱글톤 객체(Singleton)을 활용하는
// SingletonExample 실행 클래스를 소스 코딩합니다.
public class SingletonExample {
public static void main(String[] args) {
// Singleton obj1 = new Singleton(); // 컴파일 에러
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
// 결과값이 한번만 나온다. obj1 변수1 , obj2 변수2 가 같은 객체를 보고있다.
//== 주소 메모리 비교
if(obj1 == obj2) {
System.out.println("같은 Singleton 객체를 참조합니다!");
}else {
System.out.println("다른 Singleton 객체를 참조합니다!");
}
}
}
final 필드
상수 표현할 때 사용
final 필드 선언과 초기화
최종 확정된 선언만 나오게하기
상수값을 받는 객체는 대문자로 표현한다.
package chapter06.sec05.exam05;
// final 필드 선언과 초기화 이해를 위한 사람(Person) 클래스를 생성합니다.
public class Person {
// 확정됨
final String NATION = "Korea";
// final 필드 ssn은 아래 Person 생성자 매개값으로
// ssn을 받아서 초기값으로 지정되었습니다.
//매개변수로 받아서 출력되는 값이 확정이다.
final String SSN;
//name은 확정된 값이 아님
String name;
public Person(String SSN, String name) {
this.SSN = SSN;
this.name = name;
}
}
package chapter06.sec05.exam05;
// 앞서 생성한 Person 클래스를 활용하여, final 필드를 테스트할 PersonExample 실행 클래스를 코딩합니다.
public class PersonExample {
public static void main(String[] args) {
Person p1 = new Person("998821-2324587", "장나라");
// p1.nation = "Japan"; //final을 지우면 변경가능하다.
// p1.ssn = "8848345-1249493";
p1.name = "장발장";
System.out.println(p1.NATION); //Korea
System.out.println(p1.SSN); //998821-2324587
System.out.println(p1.name); // 장발장
}
}
상수
일반적으로 불변의 값을 상수라고 부른다.
FINAL필드를 상수라고 불리지않는다. 불변의 값은 객체마다 저장할 필요가 없는 공용성을 띠고 있으며, 여러가지 값으로 초기화 될 수없기 때문에 Static이면서 final이어야 한다.
객체마다 존재하지 않고 클래스에만 존재, 그리고 한번 초기값이 저장되면 변경할 수 없다.
상수선언
상수선언이 되면 outline 에 static final 표시가 뜬다.
상수사용
상수선언
package chapter06.sec05.exam06;
// 상수(static final) 선언(declaration) 이해를 위해 Earth 클래스를 생성합니다.
public class Earth {
//현재는 상수가 아님
// double EARTH_RADIUS = 6400;
// 상수가 되려면
static final double EARTH_RADIUS = 6400;
static final double EARHT_AREA = 4 * Math.PI * EARTH_RADIUS;
}
상수사용
package chapter06.sec05.exam06;
// 앞서 생성한 Earth 클래스를 활용하는 EarthExample 실행 클래스를 소스 코딩합니다.
public class EarthExample {
public static void main(String[] args) {
System.out.println("지구의 반지름 ="+ Earth.EARTH_RADIUS + "km");
System.out.println("지구의 표면적 = " + Earth.EARHT_AREA + "km^2");
}
}
//실행결과
//지구의 반지름 =6400.0km
//지구의 표면적 = 80424.77193189871km^2
'☭DEVELOPER > #2 웹개발(자바기반 풀스택)' 카테고리의 다른 글
[BACKEND]코딩테스트5 (0) | 2023.08.28 |
---|---|
[BACKEND]JAVA_ECLIPSE15 패키지와 접근 제한자 (2) | 2023.08.24 |
[BACKEND]JAVA_ECLIPSE 코딩테스트 3 (2) | 2023.08.24 |
[BACKEND]JAVA_ECLIPSE13 필드, 생성자, 메소드 (0) | 2023.08.23 |
[BACKEND]JAVA_ECLIPSE12 클래스 (0) | 2023.08.23 |