[JAVA] 클래스와 인스턴스

Coastby·2022년 7월 29일
0

JAVA

목록 보기
10/33

용어

클래스 (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 이다.
    • 따라서 sum(), avg()는 객체에 따라 다른 변수를 가지기 때문에 서로 다른 결과값을 가진다.
  • 클래스 변수 : 모든 인스턴스에서 공유하는 변수
    • 인스턴스에 따라서 변하지 않는 값이 필요한 경우 (이런 경우 final을 이용해서 상수로 선언하는 것이 바람직 하지만 final을 아직 배우지 않았기 때문에 언급하지 않았다.
    • 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우
    • 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우
  • 예제) 계산기에서 원주율을 만들어내는 메소드를 만들기
    • 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);
				
    }
  • 메소드 안에는 static 변수를 선언할 수 없다.

클래스 메소드

예제) 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);
.
.
  1. 인스턴스 메소드는 클래스 멤버에 접근할 수 있다.
  2. 클래스 메소드는 인스턴스 멤버에 접근할 수 없다.

클래스/인스턴스 - 메소드 - 변수에 대한 접근 가능성을 경우의 수에 따라 보여준다.

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();
    }
 
}
profile
훈이야 화이팅

0개의 댓글