본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 13일차 (2023-06-09) 자바 기초 DAY11

by prometedor 2023. 6. 9.

ㄴ getter 는 값을 꺼내주는 메서드

ㄴ result : int 에서 resullt 는 변수이고 private 으로 접근을 차단하는 대신 getResult() 제공함

    ㄴ 변수 : 타입 => UML 문법

 

ㄴ 아래 연산을 동시에 하고 싶을 때 인스턴스 변수 이용

    ㄴ 2 * 3 + 7 - 2 / 2 = ?

    ㄴ 3 - 1 * 7 + 15 / 3 = ?

ㄴ 인스턴스를 여러 개 만들고 싶을 때는 static 필드를 non-static 필드로 변경해줘야 함

    ㄴ 여기서 인스턴스는 Calulator 설계도에 따라 생성한 변수들을 말함

ㄴ 여기서 c1 은 레퍼런스이고 이는 Calculator 인스턴스 주소를 받을 변수임

ㄴ static 과 non-static 선택 기준

    ㄴ 필드 생성 시 인스턴스를 1개만 만들 것 => static

    ㄴ 필드 생성 시 인스턴스를 여러개 만들 것 => static

 

 

Test.java

package bitcamp.myapp;

// 소스 코드에서 Calculator 클래스는 bitcamp.util 패키지에 소속된 클래스를 가리킴
// import bitcamp.util.Calculator; // 컴파일러는 import 문장을 바이트 코드로 바꾸지 않음 // 컴파일 시 없어짐

// 메소드 활용 (static 변수를 사용하는 이유)
public class Test {
  
  public static void main(String[] args) {
    // 2 * 3 + 7 - 2 / 2 = ?
    // => 연산자 우선 순위를 고려하지 않고 앞에서부터 뒤로 순차적으로 계산

    int result = 0; // 로컬 변수는 반드시 초기 값을 설정해주어야 함

    result = 2 * 3;
    result = result + 7;
    result = result - 2;
    result = result / 2;

    System.out.println(result);
  }
}

=>

package bitcamp.myapp;

// 소스 코드에서 Calculator 클래스는 bitcamp.util 패키지에 소속된 클래스를 가리킴
// import bitcamp.util.Calculator; // 컴파일러는 import 문장을 바이트 코드로 바꾸지 않음 // 컴파일 시 없어짐

// 메소드 활용 (static 변수를 사용하는 이유)
public class Test {
  
  public static void main(String[] args) {
    // 2 * 3 + 7 - 2 / 2 = ?
    // => 연산자 우선 순위를 고려하지 않고 앞에서부터 뒤로 순차적으로 계산

    init (2);
    multiple(3);
    plus (7); 
    minus (2);
    divide (2);

    System.out.println(result);
  }
  
  static int result = 0; //로컬 변수는 반드시 초기값을 설정해줘야함
  
  static void init(int a) { // 초기화
  	result = a;
  }

  static int plus(int a, int b) {
    return a + b;
  }

  static int minus(int a, int b) {
    return a - b;
  }

  static int multiple(int a, int b) {
    return a * b;
  }

  static int divide(int a, int b) {
    return a / b;
  }
  
}

ㄴ static 메서드 추가하여 활용

    ㄴ plus(), minus(), multiple(), divide()

import bitcamp.util.Calculator; // import 는 컴파일하지 않음 => bitcamp.util.Calculator 를 복사하는 역할

// 소스 코드에서 Calculator 클래스는 bitcamp.util 패키지에 소속된 클래스를 가리킨다.
//import bitcamp.util.Calculator; // 컴파일러는 import 문장을 바이트 코드로 바꾸지 않음 // 컴파일 시 없어짐

// 메소드 활용 (static 변수를 사용하는 이유)
public class Test { // 클래스 밖에 변수 선언 불가

  public static void main(String[] args) {
    // 2 * 3 + 7 - 2 / 2 = ?
    // 3 - 1 * 7 + 15 / 3 = ?
    // => 위의 계산을 동시에 수행하기

    // 두 개의 계산 결과를 저장할 수 있는 result 변수를 준비한다.
    // 인스턴스 필드 (new 명령을 통해서만 heap에서만 생성됨)
    Calculator c1 = new Calculator(); // 위치 받아서 c1에 저장
    Calculator c2 = new Calculator(); // 위치 받아서 c2에 저장

    c1.init(2);
    c2.init(3);
    c1.multiple(3);
    c2.minus(1);
    c1.plus(7);
    c2.multiple(7);
    c1.minus(2);
    c2.plus(15);
    c1.divide(2);
    c2.divide(3);

    System.out.println(c1.getResult()); // static 을 붙여주니까 제대로 실행됨

    System.out.println(c2.getResult()); // static 을 붙여주니까 제대로 실행됨
  }

}

ㄴ 두 연산 동시 계산 

 

변화 과정

ㄴ result 를 static 변수로 바꿔줘야 함

ㄴ 선택한 부분을 Calculator 라는 클래스로 이동시킴

 

Calculator.java

// 여러 곳에서 사용할 클래스라면 패키지 멤버로 만드는 것이 유지보수에 좋다.
// => 패키지 멤버 클래스
public class Calculator {

  static int result = 0;
  
  static void init(int a) {
  	result = a;
  }

  static void plus(int value) {
    result += value;
  }

  static void minus(int value) {
    result -= value;
  }

  static void multiple(int value) {
    result *= value;
  }

  static void divide(int value) {
    result /= value;
  }
}

=>

// 여러 곳에서 사용할 클래스라면 패키지 멤버로 만드는 것이 유지보수에 좋다.
// => 패키지 멤버 클래스
class Calculator {

  int result = 0;

  void plus(int value) {
    this.result += value;
  }

  void minus(int value) {
    this.result -= value;
  }

  void multiple(int value) {
    this.result *= value;
  }

  void divide(int value) {
    this.result /= value;
  }

  // 인스턴스를 사용하지 않는 메서드라면 그냥 클래스 메서드로 두어라.
  static int abs(int value) {
    return value >= 0 ? value : value * -1;
  }
}

 

Test.java

Calculator.java

 

Test.java

ㄴ Calculator 클래스에 static 추가

ㄴ 값을 임의로 넣어버릴 수 있는 문제가 있어서 result 값은 private 으로 접근 제한을 해줘야 함

=> result 를 직접 접근하지 않는 것이 좋음

 

Calculator.java

 

Test.java

ㄴ getResult() 라는 메서드를 Calculator 클래스에 추가하여 사용할 것

 

Calculator.java

ㄴ getResult() 라는 메서드를 Calculator 클래스에 추가

 

ㄴ getResult() 를 private 으로 설정하면 Test.java 에서 사용할 수 없으므로 public 으로 설정하자

 

Test.java

ㄴ 두 가지 연산을 하기 위함

 

ㄴ Calculator c1 = new Calculator, Calculator c2 = new Calculator() 를 이용해 인스턴스 생성

 

Calculator.java

ㄴ getResult 를 이용해 인스턴스를 받아오도록 함

ㄴ 어느 인스턴스를 쓸 것인지를 받아오도록 하고, 해당 인스턴스의 result 값을 받아옴

 

Test.java

ㄴ 어느 인스턴스를 넘겨줄 지와 넘겨줄 result 값을 넣어주기

ㄴ 두 연산 동시에 실행하기 위해 위처럼 변경

 

Calculator.java

ㄴ static 제거

 

Test.java

 

Calculator.java

ㄴ static 제거한 경우 인스턴스를 여러 개 만들 수 있음

=> new 명령 통해서 result 라는 이름을 가진 변수를 만들기 (result = 인스턴스)

     ㄴ 인스턴스 Calculator 설계도에 따라 생성한 변수들

     ㄴ 인스턴스 별로 독자적으로 관리 가능

ㄴ 어떤 인스턴스의 변수인지 알기 위해 this 필요

=> 인스턴스의 this 는 컴파일러가 자동으로 만드는 로컬변수

    ㄴ this 를 생략하면 컴파일러가 붙여주긴 하지만 this 를 생략하지 말자

ㄴ 인스턴스의 this 에는 주소가 들어감

ㄴ non-satic => this 라는 로컬변수가 존재

ㄴ satic => this 라는 로컬변수가 존재하지 않음

 

=> 클래스 파일 확인

ㄴ result2 라는 static 변수를 추가하고 차이를 확실하게 보기 위해  geResult() 에도 값 넣어주기

ㄴ Calculator 에 있는 this 는 외부에서 넘겨준 인스턴스 주소를 저장함

ㄴ 클래스 파일 열어서 확인

ㄴ getResult() 에서는 this 의 존재를 확인할 수 있음