객체지향 언어의 가장 큰 특징으로 캡슐화(Encapsulation)을 빼놓을 수 없다. 여러 자료및 처리과정을 하나의 모듈(부품)처럼 사용하므로 객체간의 이식성이 높아지기 때문이다. 캡슐화란 관련 있는 자료, 동작들을 하나로 묶어 요약하고 사용자에게는 배우적인 접근을 허용하지 않는 대신에 사용의 편의성을 제공해주는 것이다.
public class Car {
private int speed = 50;
public void speedUp(){
this.speed = 50;
System.out.println(speed+"km 로 운행중입니다.");
}
public void speedBreak(){
this.speed = 0;
System.out.println(speed+"km 로 정지합니다.");
}
public void drive(){
speedUp();
speedBreak();
}
}
다음과 같이 개발자는 speed에 접근이 불가능하므로 직접 speed를 조작할 수 없다. speed를 올리기 위해서는 speedUp으로 속도를 올리고 speedBreak를 통해 정지해야한다. 그리고 이 코드에서 앞서 말한 speedUp()과 speedBreak() 또한 private로 접근을 제한한 후 동작들을 하나로 묶어 요약하고 사용자에게는 내부적인 접근을 허용하지 않는 drive()라는 메서드를 사용하게만 한다면 이것이 캡슐화된 코드가 될 수 있다.
변수에는 멤버 변수와 지역변수가 존재하며 또한 멤버 변수에는 두가지의 형태가 있다.
class Car{
int speed; //멤버 변수
public int setSpeed(int speed){ //지역 변수
return this.speed = speed;
}
}
먼저 멤버 변수에 대해 알아보자 멤버 변수와 같은 말로는
가 존재하며 class 전역에서 사용이 가능한 변수이다.
instance 변수
class Car{
int speed;
public int setSpeed(int speed){
return this.speed = speed;
}
}
Car car1 = new Car();
car1.setSpeed(20);
Car car2 = new Car();
car2.setSpeed(30);
다음과 같이 Car라는 객체를 2개 생성하여 각각의 speed값을 세팅해주었다. 이렇게 되면 car1과 car2의 속도는 서로 다른 각각의 값을 가질 수 있다. 이렇게 다른 값을 가질 수 있는 변수를 instance 변수라 한다.
결과는 다음과 같다.
위 코드에서 class내에 선언된 speed만이 멤버 변수이며 method에 매개변수(parameter)로 선언된 speed는 지역변수이다. 위에서 말한것과 같이 멤버 변수에는 instance 변수와 static 변수 두가지 형태가 있으며 instance 변수는 각 객체들마다 따로 따로 생성되어 각각 독릭된 값을 가질 수 있다.
class 변수다음과 같이 자동차 제조사에 대한 정보를 static으로 선언했다. 이렇게 static으로 멤버 변수를 선언하면 class 변수가 되는데 class 변수는 모든 객체에서 공통으로 공유하게되는 값을 의미한다. 예를들어 car1과 car2 순서로 각각 carCorporation에 대한 값을 변경한다면 car1의 carCorporation의 값은 car1에서 설정한 값이 아닌 car2에서 설정한 값을 둘이서 공유하게되는 것이다.다음과 같은 코드가 있을때 결과 car1의 결과값은 어떻게 될까? 우리가 선언한 CarCorporation은 class 변수이기 때문에 car1과 car2는 CarCorporation의 값을 공유하므로 결과는 BMW가 나온다
void Test(){
Car car1 = new Car();
car1.setCarCorporation("포르쉐");
Car car2 = new Car();
car2.setCarCorporation("BMW");
System.out.println("car1 corporation = " + car1.getCarCorporation());
}
class Car{
static String carCorporation;
int speed;
public int setSpeed(int speed){
return this.speed = speed;
}
public String setCarCorporation(String carCorporation){
return this.carCorporation = carCorporation;
}
public String getCarCorporation(){
return carCorporation;
}
멤버 변수와 지역변수의 차이는 위의 코드와 같이 class에 선언되는 것이 아닌 method에 선언된다는 것인데. method가 실행됨에 따라 생성되어지고 method가 종료되면 소멸되어진다.
public void setStr(String str){
str = "스트링";
}
public void printStr(){
System.out.println(str);
}
위 코드와 같이 String type의 str을 위에서 선언했지만 str은 오류로 찍힐것이다.
str는 setStr() method가 실행되는 구간에서만 메모리에 존재하기 때문이다. 그리고 이를 생명주기라 한다.