클래스 (class): 설계도, 메소드의 정의
인스턴스 (instance): 제품, 메소드 호출
프로그래밍 언어를 통해서 기술적으로 객체를 만드는 방법
건강한 코드는 중복되는 것이 없어야한다.
리팩토링 : 같은 역할을 하지만 코드를 효율적으로 만드는 행위
메소드 사용의 장점 :
메소드가 많아지면서의 문제점 :
public class CalculatorDemo {
public static void main(String[] args) {
//객체생성 (인스턴스 c1)
Calculator c1 = new Calculator();
//setOprands 메소드에 인자값 전달
c1.setOprands(10, 20);
//c1인스턴스.메소드에 변수입력 안해도, 메소드를 호출하면 값이 리턴된다
c1.sum();
c1.avg();
}
}
class Calculator{
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}
public void sum(){
System.out.println(this.left+this.right);
}
public void avg(){
System.out.println((this.left+this.right)/2);
}
}
this.left
: 클래스 안에서 만들어진 int left
변수를 말함. 메소드 밖에서 선언한 변수이므로 인스턴스 내의 모든 메소드에서 접근이 가능하다.left
: 우항의 변수는 메소드 안에서의 매개변수, 인스턴스에서 받아온 변수가 들어간다. setOprands
의 매개변수이므로 이 메소드 안에서만 접근할 수 있다.sum()
, avg()
에는 클래스의 변수가 들어간다.변수는 다른 말로는 상태 (state)라고도 한다. c1.sum
의 결과와 c2.sum
의 결과가 다른 것을 통해 알 수 있듯이 상태가 다른 객체를 대상으로 메소드를 실행 (behave)시키면 다른 결과를 나타내게 된다.
즉, 하나의 클래스를 바탕으로 서로 다른 상태를 가진 인스턴스를 만들면 같은 메소드로 다른 결과가 나온다는 것을 알 수 있다. 하나의 클래스가 여러개의 인스턴스를 만들 수 있다는 점이 객체 지향이 제공하는 가장 기본적인 재활용성이라고 할 수 있다.
객체 지향의 객체를 하나의 작은 프로그램처럼 느껴보자. 프로그램 안에 객체라는 작은 프로그램을 만드는 것이다.
Calculator
에서 instance의 소유인 변수는 left
, right
이다.static
: 변수 앞에 이를 붙이면서 클래스에 소속이 된다. 변수를 모든 인스턴스에서 동일한 값을 같게 된다.class Calculator{
static double PI = 3.14;
int left, right;
public void setOprands(int left, int right){
this.left = left;
this.right = right;
}...
인스턴스.클래스변수이름()
또는 클래스이름.클래스변수이름()
으로 접근할 수 있다.public class CalculatorDemo1 {
public static void main(String[] args) {
Calculator c1 = new Calculator();
System.out.println(c1.PI);
Calculator c2 = new Calculator();
System.out.println(c2.PI);
// 3.14 출력
System.out.println(Calculator.PI);
//변수대입도 가능
Calculator.PI = 10;
// 10.0 출력
System.out.println(Calculator.PI);
}
예제) CalculatorDemo3
인스턴스를 형성하지 않고도 클래스.메소드();
로 바로 메소드에 접근할 수 있다.
일회용으로 메소드를 사용할 때, 굳이 메모리를 사용하지 않고 클래스의 메소드만 사용할 수 있다.
class Calculator3{
public static void sum(int left, int right){
System.out.println(left+right);
}
.
.
.
public class CalculatorDemo3 {
public static void main(String[] args) {
Calculator3.sum(10, 20);
Calculator3.avg(10, 20);
.
.
클래스/인스턴스
- 메소드
- 변수
에 대한 접근 가능성을 경우의 수에 따라 보여준다.
class C1{
static int static_variable = 1;
int instance_variable = 2;
static void static_static(){
System.out.println(static_variable);
}
static void static_instance(){
// 클래스 메소드에서는 인스턴스 변수에 접근 할 수 없다.
//System.out.println(instance_variable);
}
void instance_static(){
// 인스턴스 메소드에서는 클래스 변수에 접근 할 수 있다.
System.out.println(static_variable);
}
void instance_instance(){
System.out.println(instance_variable);
}
}
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();
}
}