객체지향 이해하기 - 1
static , final
Static
- 모든 객체가 같은 값을 공유한다.
- static 변수와 메서드는 한번만 생성되고 Method Area에 저장된다.
인스턴스 맴버 (인스턴스 변수 + 인스턴스 메서드 )
- 객체를 만들때마다 생성되는 변수와 메서드이다.
- 각 객체가 개별적으로 값을 가진다 ( 공유 X )
- 인스턴스는 Heap 영역에 위치한다.
인스턴스 변수
- 객체가 생성될 때마다 따로 만들어지는 변수
( 객체를 생성한 후 접근할 수 있다. )
클래스 변수
- 클래스가 로드될때 한번만 생성
- 모든 객체가 공유하는 변수이다.
- Heap이 아니라 Mthod Area에 저장된다.
( 객체를 만들지 않아도 “클래스명.변수명”으로 접근 가능)
Static, 인스턴스 맴버 예제
// Main class
// static 변수, 메서드 활용
System.out.println("static 변수 활용 : " + Person.population);
Person.printPopulation();
// 인스턴스 멤버 활용
Person p1 = new Person();
Person p2 = new Person();
// 인스턴스 변수 활용
p1.name = "kim";
p2.name = "Steve";
// 인스턴스 메서드 활용
p1.pringName();
p2.pringName();
Person.printPopulation();
// static : 모든 객체가 같은 값을 공유한다 -> 공용 게시판이다.
// Person class
public class Person {
// 인스턴스 변수
String name ;
// static 변수
static int population = 0;
Person(){
population++;
}
// 인스턴스 매서드
void pringName(){
System.out.println("나의 이름은 = " + this.name + "입니다.");
}
// static 메서드
static void printPopulation(){
System.out.println("현재 인구 수 = " + population);
}
}
final
- 변수는 변경이 불가능하게 만든다
- 클래스는 상속할 수 없게 만든다
- 메서드는 수정할 수 없게 만든다.
Constant
- 상수는 변하지 않고 일정한 값을 갖는 수이다.
불변객체
불변객체는 내부 상태를 변경할 수 없는 객체이다.
final을 속성에 활용한다.
세터 없이 설계한다.
변경이 필요한 경우 새로운 객체를 만들어야 한다.
ex ) String , Integer , 래퍼클래스 등등..
final, Constant, 불변객체 예제
// Main class
public class Main {
public static void main(String[] args) {
// final 활용
final int a = 1;
// a= 2;
System.out.println("a = " + a);
// 상수 활용 방법
System.out.println("PI 값은 : " + Circle.PI);
// 불변 객체 활용
final Circle c1 = new Circle(2);
// 참조 변경을 막지만 내부상태 변경은 막지 않는다.
// c1 = new Circle(5)
// c1.radius = 5;
System.out.println("c1 = " + c1);
// 불변 객체의 내부상태가 변경이 필요한 경우
Circle c2 = new Circle(10); // 생성자
Circle c3 = c2.changeRadius(20); // 기능을 활용
}
}
// 결과값
// a = 1
// PI 값은 : 3.14159
// c1 = chapter2.finalexample.Circle@2f4d3709
// Circle class
public class Circle {
// 속성
final static double PI = 3.14159;
final double radius;
// 생성자
Circle(double radius){
this.radius = radius;
}
//기능
Circle changeRadius(double newRadius){
return new Circle(newRadius);
}
}
인터페이스
- 인터페이스를 하는 이유 : 모든 설계에 표준이 있는 이유와 같은 이유이다.
- 개발자마다 서로 다른 방식으로 메서드를 만들면 일관성이 깨질 수 있기 때문이다.
인터페이스 예제
// Car class
public class Circle {
// 속성
final static double PI = 3.14159;
final double radius;
// 생성자
Circle(double radius){
this.radius = radius;
}
//기능
Circle changeRadius(double newRadius){
return new Circle(newRadius);
}
}
// LuxuryCar class
public class LuxuryCar implements Car {
@Override
public void drive() {
System.out.println("멋지게 이동합니다");
}
@Override
public void stop() {
System.out.println("멋지게 정지합니다");
}
void charge(){
System.out.println("차량을 충전합니다.");
}
// void move(){
// System.out.println("멋지게 이동합니다");
// }
// void stop(){
// System.out.println("멋지게 정지합니다");
// }
//
}
// SpeedCar class
public class SpeedCar implements Car{
@Override
public void drive() {
System.out.println("빠르게 이동합니다");
}
@Override
public void stop() {
System.out.println("빠르게 정지합니다");
}
void autoParking(){
System.out.println("자동 주차 기능을 가동합니다.");
}
// void drive(){
// System.out.println("빠르게 주행합니다");
// }
}
// Main class
public class Main {
public static void main(String[] args) {
// 인스턴스화
LuxuryCar luxuryCar = new LuxuryCar();
SpeedCar speedCar = new SpeedCar();
// 활용
// luxuryCar.move();
// luxuryCar.stop();
//
// speedCar.move();
// speedCar.stop();
// speedCar.drive();
// 인터페이스 활용
luxuryCar.drive();
speedCar.drive();
luxuryCar.stop();
speedCar.stop();
luxuryCar.charge();
speedCar.autoParking();
}
}
// 결과값
// 멋지게 이동합니다
// 빠르게 이동합니다
// 멋지게 정지합니다
// 빠르게 정지합니다
// 차량을 충전합니다.
// 자동 주차 기능을 가동합니다.