221214 객체지향프로그래밍

kangjuju·2022년 12월 14일
0

자바자습

목록 보기
2/3

메소드: 서로 연관된 코드를 그룹핑해서 이름 붙인 정리 정돈의 상자
클래스: 서로 연관된 변수와 메소드들을 모아서 이름을 붙인 것
인스턴스: 하나의 클래스를 복제해서 서로 다른 데이터의 값과 서로 같은 메쏘드를 가진 복제본을 만드는 것.

클래스의 기본 구조

class Print{
    public static String delimiter = "";
    public static void A() {
        System.out.println(delimiter);
        System.out.println("A");
        System.out.println("A");
    }
    public static void B() {
        System.out.println(delimiter);
        System.out.println("B");
        System.out.println("B");
    }
}

//사용시
  public static void main(String[] args) {
        Print.delimiter = "----";
        Print.A();
        Print.A();
        Print.B();
        Print.B();
         
        Print.delimiter = "****";
        Print.A();
        Print.A();
        Print.B();
        Print.B();
    }

class라는 키워드를 사용하고 클래스의 이름을 정한다.
중괄호 안에 그 클래스의 소속인 변수,메소드를 담아준다.
그것들을 클래스의 멤버라고 부른다.

그렇게 만든 클래스는 앞에 public키워드를 붙인다. (접근제어자)

하나의 파일 안에서 클래스를 여러개 만들면 각각의 클래스가 파일로써 존재하게된다.

클래스 Refactoring

위 코드 부분에서 클래스부분만을 드래그하고,

Refactor - move Type to New File

을 클릭하면

기존 코드에 있던 클래스 구문은 사라지고, 그대로 새로 생성한 클래스파일에 자동으로 담겨진다.

인스턴스

클래스를 복제하여 사용하는것. 인스턴스 (new)

class Print{
    public String delimiter = "";
    public void A() {
        System.out.println(delimiter);
        System.out.println("A");
        System.out.println("A");
    }
    public void B() {
        System.out.println(delimiter);
        System.out.println("B");
        System.out.println("B");
    }
}


public static void main(String[] args) {
        Print p1 = new Print();
        p1.delimiter = "----";
        p1.A();
        p1.A();
        p1.B();
        p1.B();
        
        Print p2 = new Print();
        p2.delimiter = "****";
        p2.A();
        p2.A();
        p2.B();
        p2.B();
        
    }

하나의 클래스의 상태가 계속해서 바뀌는 복잡한 코드의경우
클래스를 복제한 인스턴스를 활용하여
각각의 인스턴스에 값을넣고

필요한 값에따라서 필요한 인스턴스의 메소드를 호출하면
더욱깔끔하게 정리가 가능하다

자유롭게 인스턴스의 값변경을 위해서는 Print클래스에서 static을 지워야했다.

  • 프로그램 실행 중에 같은 값을 유지해야하는 곳에는 static
  • 가변적으로 원하는 값을 넣어서 계속 수정되는 곳에는 static 을 붙이면 안됨
  • instance 는 한번 쓰이고나면 가비지 컬렉터에 의해 사라짐
  • instance 변수가 필요하지 않은 곳에는 static 을 선언한다. 프로그램이 우선적으로 탐색하기 때문에 더 빠르게 실행된다

static

static존재 -> class소속
static없음 -> 클래스를 복제한 인스턴스소속

클래스를 복제한 인스턴스들에서
클래스의 static이없는 변수,메소드들은 인스턴스내에서 각각 독립적으로 새로 존재.
클래스의 static이있는 변수,메소드들은 인스턴스내에서 존재한다기보단 class의 존재하는것들을 가리킴(연결됨)

따라서
인스턴스에서 static이 있는 변수 혹은 메소드를 수정시
class에서 그원본 자체가 수정이되고
그변수,메소드를 가리키는 모든곳에서 수정이된다.

인스턴스에서 static이 없는 변수 혹은 메소드를 수정시
static이없는 변수 혹은 메소드는 인스턴스생성시 독립적으로 새로 생성된것이므로
그인스턴스내에서 독립적으로 수정이된다.

생성자

인스턴스가 생성될 때

  • 반드시 처리해야 할 작업의 초깃값 지정
  • 혹은 최초로 실행되어야 할 작업들 수행하고 싶을 때 생성자 사용

Print p1 = new Print("----");

----부분을 인자로 꼭 넣어야만 인스턴스화 될 수 있는 클래스를 만드려면
생성자가 필수이다.

class Print{

    public String delimiter = "";
    public Print(String _delimiter) {  <===초기화를 하는 메소드. 생성자
    	delimiter = _delimiter;
    }
    
    public void A() {
        System.out.println(delimiter);
        System.out.println("A");
        ...
        ..

this

클래스가 인스턴스화 되었을 때 인스턴스를 가리키는 특수한 이름

class Print{
public String delimiter = "";
public Print(String delimiter) {
this.delimiter = delimiter;
L_인스턴스의 del변수. this를 붙였기에
인자로써의 del이 아닌위에 선언한 del을 가리킨다.
}

또한
public void A() {
    System.out.println(this.delimiter); <==이렇게 작성하는것이 바람직
    System.out.println("A");
    System.out.println("A");
}

클래스 활용

class Accounting{
    public double valueOfSupply;// 공급가액
    
    public Accounting(double valueOfSupply){
    	this.valueOfSupply = valueOfSupply;
    }
    
    public static double vatRate = 0.1; // 부가가치세율
    public  double getVAT() {  //공급가액에 10퍼의 부가세를 알려줌
        return valueOfSupply * vatRate;
    }
    public  double getTotal() { //공급+부가 합계
        return valueOfSupply + getVAT();
    }
}
public class AccountingApp {
    public static void main(String[] args) {
    	
    	Accounting a1 = new Accounting(10000.0);

    	Accounting a2 = new Accounting(20000.0);

        System.out.println("Value of supply : " + a1.valueOfSupply);
        System.out.println("Value of supply : " + a2.valueOfSupply);
        System.out.println("VAT : " + a1.getVAT());
        System.out.println("Total : " + a1.getTotal());
    }
}

부가세 계산 앱을 객체지향적으로 개선했다.

static은 클래스의 소속인데 이 클래스가 인스턴스의 변수에 접근하려면 어떤 인스턴스의 변수인지 알 수 없음

  • static이 아닌 변수에 접근하는 메소드는 static이면 안 됨

static으로 선언된 변수들은 인스턴스를 만들 때마다 컴퓨터의 메모리를 사용하지 않아도 되기 때문에 자원을 절약할 수 있음

0개의 댓글