추상화란?
복잡함 속에서 필요한 관점만을 추출하는 행위
예)지하철 노선도
부품화란?
컴퓨터가 모니터, 마우스, 키보드, 본체 등과 같은 부품들로 나뉘어지는 것
은닉화, 캡슐화란?
내부의 동작 방법을 단단한 케이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것
인터페이스란?
부품들 간의 약속
예) 본체에 A사 모니터를 연결할 수도 있고 B사 모니터도 연결 가능하다는 것
클래스란?
객체의 설계도
인스턴스란?
클래스(설계도)에 따라 만들어진 구체적인 제품
객체란?
상태와 행위의 집합(변수와 메소드)
객체 vs 인스턴스
구체적인 코드 상에서 나타나는 객체를 인스턴스,
로직을 설계할 때 나타나는 인터턴스를 객체라고 부른다.
멤버란?
구성원 -> 변수, 메소드
멤버변수란? = 인스턴스 변수 + 클래스 변수 (클래스 내에서 사용 가능)
메소드 밖에서 선언된 변수
지역 변수란?
메서드 안에서만 선언되고 해당 메서드 안에서만 사용 가능
인스턴스 변수란?
인스턴스마다 값이 다를 때 사용하는 것
클래스 변수란? (static)
모든 인스턴스에서 똑같은 값을 갖는 것
변수의 변경사항을 모든 인스턴스에서 공유해야할 때 사용
★ 객체를 생성하지 않고도 클래스에 직접 접근해서 값을 사용할 수 있다. ★
public class Test{
int global = 1;
static int staticValue = 10;
public void method1(int x) {
int local = 2;
// global, local, x 출력 가능
// static한 변수는 static하지 않은 메서드내에서 사용 가능
System.out.println(staticValue);
}
// static한 main 메서드
public static void main(String[] args) {
//System.out.println(global); -> 출력 불가능(객체 생성해야 함)
//System.out.println(local); -> 출력 불가능(객체 생성해야 함)
// static한 메서드에서는 static 하지 않은 필드를 사용할 수 없음
// 즉, static이 아닌 것 필드들은 객체 생성 후 사용할 수 있다는 것!
System.out.println(staticValue);
Test t1 = new Test();
Test t2 = new Test();
t1.staticValue = 100;
t2.staticValue = 200;
// t1과 t2는 전부 200이 된다.
// global과 다르게 staticValue는 static한 변수, 값을 저장할 수 있는 공간이
// 하나밖에 없어서 값을 공유함 -> 클래스 변수이므로 클래스이름명.클래스변수명으로 사용 가능
System.out.println(Test.staticValue);
// global -> 인스턴스 변수
}
}
public class Calculator {
int left, right; //인스턴스 변수
static double PI = 3.14; //클래스 변수
static int base = 0;
void setOprands(int left,int right) {
this.left = left; //this.left는 인스턴스 변수, left는 매개변수를 뜻한다.
this.right = right;
}
/* 이 코드도 가능하다. left와 right라는 지역변수가 없기 때문에 전역변수로 인지한다.
void setOprands(int _left,int _right) {
left = _left;
right = _right;
} */
void add() {
int result1 = left+right;
System.out.println("합은 "+result1);
}
void sub() {
int result2 = left-right;
System.out.println("차는 "+result2);
}
void mul() {
int result3 = left*right;
System.out.println("곱은 "+result3);
}
void div() {
int result4 = left/right;
System.out.println("나눗셈은 "+result4);
}
public void avg() {
int result5 = (left+right)/2;
System.out.println("평균은 "+result5);
}
}
public class CalculatorDemo {
public static void main(String[] args) {
Calculator c1 = new Calculator();
c1.setOprands(10,20);
c1.add(); //30
c1.sub();
c1.mul();
c1.div();
c1.avg();
c1.base=10;
c1.add(); //40
System.out.println(c1.PI); //객체를 생성한 클래스 변수 접근
System.out.println();
Calculator c2 = new Calculator();
c2.setOprands(40,20);
c2.add();
c2.sub();
c2.mul();
c2.div();
c2.avg();
System.out.println(c2.PI);
System.out.println();
System.out.println(Calculator.PI); //객체를 생성하지 않고 클래스를 통해서 접근
}
this.left의 this.
우리가 생성한 c1이 담겨있는 Calculator라고하는 클래스를 구체적인 제품으로 만든 인스턴스를 가르키는 것
= Calculator를 정의할 때 int left, right의 변수(인스턴스 변수) -> 인스턴스 자신
left는 매개변수를 가르키는것으로 setOprands 밖에서는 접근할 수 없다.
left를 this.left라고 하면 어디서든지 접근할 수 있는 left 변수를 뜻한다.
public class C1 {
static int static_variable = 1;
int instance_variable = 2;
static void static_static(){
System.out.println(static_variable+" - 클래스 메소드에서 클래스 변수에 접근 가능"); //결과 1
}
static void static_instance(){
// 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다.
//System.out.println(instance_variable);
}
void instance_static(){
// 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
System.out.println(static_variable+" - 인스턴스 메소드에서 클래스 변수에 접근 가능"); //결과 1
}
void instance_instance(){
System.out.println(instance_variable+" - 인스턴스 메소드에서 인스턴스 변수에 접근 가능"); //결과 2
}
}
public class ClassMemberDemo {
public static void main(String[] args) {
C1 c = new C1();
// 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
// 정적 메소드가 정적 변수에 접근 -> 성공
c.static_static();
// 인스턴스를 이용해서 정적 메소드에 접근 -> 성공
// 정적 메소드가 인스턴스 변수에 접근 -> 실패
c.static_instance();
// 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
// 인스턴스 메소드가 클래스 변수에 접근 -> 성공
c.instance_static();
// 인스턴스를 이용해서 인스턴스 메소드에 접근 -> 성공
// 인스턴스 메소드가 인스턴스 변수에 접근 -> 성공
c.instance_instance();
// 클래스를 이용해서 클래스 메소드에 접근 -> 성공
// 클래스 메소드가 클래스 변수에 접근 -> 성공
C1.static_static();
// 클래스를 이용해서 클래스 메소드에 접근 -> 성공
// 클래스 메소드가 인스턴스 변수에 접근 -> 실패
C1.static_instance();
// 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패 : 아직 인스턴스가 생성되지 않았다!!
//C1.instance_static();
// 클래스를 이용해서 인스턴스 메소드에 접근 -> 실패
//C1.instance_instance();
}
}
결론은 인스턴스 메소드는 클래스 멤버와 인스턴스 멤버에 접근할 수 있고
클래스 메소드는 클래스 멤버에 접근할 수 있지만 인스턴스 멤버에 접근할 수 없다!
객체는 설계도인 클래스가 먼저 생성되고 그에 따른 인스턴스가 순서대로 생성된다.
클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드는 인스턴드멤버에 접근할 수 없는 것이다.