2022.07.20 수요일/자바 정리/클래스 사용법/static/instance

Jimin·2022년 7월 20일
0

비트캠프

목록 보기
5/60

아침 알고리즘

  • 비트 연산자의 특징
    - OR(|)
    • AND(&)
    • XOR(^)
  • XOR과 비트 연산의 특징
    • 결합법칙을 만족
    • 교환법칙을 만족
  • 시간 복잡도

-- 패리티 비트와 XOR 연산자

  • x & (x-1): 최하위 비트에서 1 값을 갖는 비트를 0으로 만드는 공식


본 수업

인스턴스 메서드와 연산자

클래스 문법 활용: 메서드를 묶어 분류하기

  1. 메서드를 클래스로 묶어 분류해 놓으면 좋은 점?
  • 관련된 메서드가 한 클래스에 묶여 있기 때문에 소스코드를 유지보수 하기가 쉬워진다.
  • 다른 프로젝트에서 메서드를 재사용하기가 쉽다.
  1. 클래스 변수 = static 변수
  • method의 작업결과를 외부에 두지 말고, 기능별로 method를 묶은 class 내부에서 관리하자 ==> 유지보수가 쉽다.
  • 그 method의 작업결과를 외부 변수에서 관리하면 불필요하게 길을 돌아가는 것과 같다.
  • 클래스 변수는 new 명령으로 생성하지 않는다.
  • 클래스가 메모리에 로딩될 때 자동으로 Method Area 영역에 생성된다.
  • static method는 this 사용 불가하다.

- 클래스 변수와 인스턴스 변수

class A{
	//instance 변수 a, b
	int a; 
    int b;
    // ----------------------------
    
    //class 변수 c
    static int c;
    // ----------------------------
    
    //instance method m()
    void m(){
    	...
    }
}
// obj1, obj2는 local 변수이다.
A obj1 = new A();
A obj2 = new A();
  • Method Area
    • 모든 명령어 생성
    • Method 생성
    • class 변수(static 변수) 생성
      • class 변수는 단 한번만 로딩 된다.
  • JVM Stack
    • local 변수만 생성
  • Heap
    • new 했을 때, instance변수만 생성
    • heap에는 method 생성 X

- 클래스 변수의 한계

  • 클래스 변수는 오직 한 개만 존재하기 때문에 여러개의 작업을 동시에 진행할 수 없다.
    즉, 한 개의 식을 계산하고 다른 식을 계산하고자 한다면, 초기화를 하고 진행하여야 한다.
  • 따라서 이런 경우, INSTANCE(non-static) 변수를 사용한다.

- instance 변수

  • 작업 결과를 개별적으로 관리하고 싶을 때 인스턴스 변수로 선언한다.
  • 직접 접근이 안되고 항상 new로 객체를 만들어서 인스턴스 주소를 만들어 접근할 수 밖에 없다.
  • static 메소드에서 인스턴스 변수를 다루기 위해서는 작업을 수행할 때, 그 인스턴스의 주소를 받아야한다.
    -> 인스턴스 변수는,
    static 변수가 아니기 때문에 직접 접근이 안되고,
    오직 인스턴스 주소를 통해서만 접근할 수 있기 때문이다.

- 인스턴스 변수와 인스턴스 메소드

  • 인스턴스 변수를 다룰 때는 인스턴스 메소드를 사용하는 것이 좋다.
    -> 따로 인스턴스의 주소를 파라미터로 받을 필요가 없기 때문이다.
  • 메서드를 호출할 때 앞쪽에 인스턴스 주소를 이미 지정한다.
Calculator c1 = new Calculator();
c1.plus(2); 
//c1이 인스턴스 주소를, 인스턴스 메소드 plus에 전달한다.
  • 메서드를 호출할 떄 앞쪽에 지정한 인스턴스 주소this 라는 내장 변수에 자동으로 저장된다.
  • 인스턴스 변수를 안쓰는 메소드라면 그냥 클래스 메서드로 두는 것이 좋다.

- 패키지 멤버 클래스

  • 패키지 멤버 클래스로 클래스 분류
  • 여러 곳에서 사용할 클래스라면, 패키지 멤버로 만드는 것이 유지보수에 좋다.

- 클래스를 역할에 따라 패키지로 분류하기

  • 패키지가 달라졌으므로, import 이용
  • import: 클래스를 쓰기전에 패키지 소속을 컴파일러에게 알려준다.

board-app 프로젝트 수행

리팩토링: 함수 추출 및 함수 옮기기

  • 게시판을 추가할 수 있도록 메뉴 구조를 정리
  • 메뉴에 따라 사용자 입력을 다루기: 메소드 추출
  1. 1단계: 메뉴 구조를 변경한다.
    • 메인 메뉴 추가
loop: while (true) {
      //메인 메뉴 출력
      System.out.println();
      System.out.println("메뉴: ");
      System.out.println("  1: 게시판");
      System.out.println("  2: 독서록");
      System.out.println("  3: 방명록");
      System.out.println("  4: 공지사항");
      int mainMenuNo = 
      Prompt.inputInt("메뉴를 선택하세요[1..4] (0: 종료) ");
      System.out.println();
      switch (mainMenuNo) {
        case 0:
          Print.bye();
          break loop;
        case 1: // 게시판
          break; // 메인 메뉴 화면으로 돌아가기
        case 2: // 독서록
          break;
        case 3: // 방명록
          break;
        case 4: // 공지사항
          break;
        default:
          Print.wrongMessage();
      }//switch 끝
  1. 2단계: 리팩토링; 게시판 메뉴를 다루는 코드를 메서드로 추출한다.
    • 메소드는 보통 동사구으로 하는데, onBoardMenu()와 같이 전치사구으로도 짓는다.
    • onBoardMenu() 메서드 추가
    • displayMenu() 메서드 제거: onBoardMenu로 그냥 코드 옮기기
static void execute() {
    while(true) {
      // 게시판 메뉴 출력
      System.out.println();
      System.out.println("게시판: ");
      System.out.println("  1: 목록");
      System.out.println("  2: 상세보기");
      System.out.println("  3: 등록");
      System.out.println("  4: 삭제");
      System.out.println("  5: 수정");
      System.out.println();
      int menuNo = 
      Prompt.inputInt("메뉴를 선택하세요[1..5] (0: 이전) ");
      displayHeadLine('-');
      switch (menuNo) {
        case 0:
          Print.bye();
          return;
        case 1:
          BoardHandler.processList();
          break;
        case 2:
          BoardHandler.processDetail();
          break;
        case 3:
          BoardHandler.processInput();
          break;
        case 4:
          //메뉴 삭제
          BoardHandler.processDelete();
          break;
        case 5:
          //게시글 변경
          BoardHandler.processUpdate();
          break;
        default:
          Print.wrongMessage();
      }
      displayBlankLine();
    }//게시판 while
  }


  static void displayHeadLine(char c) {
    for (int i = 0; i < 45; i++) {
      System.out.print(c);
    }
    System.out.println();
  }

  static void displayBlankLine() {
    displayHeadLine('=');
    System.out.println();
  }
  1. 3단계: 게시판 메뉴를 출력하는 Method를 BoardHandler로 옮기기
  • 게시판 메뉴를 다루는 코드인 onBoardMenu() 메소드를 게시판 메뉴를 다루는 클래스인 BoardHandler로 method move.
  • 리팩토링은 계속 메소드명과 변수명에 집착해야한다.
    (기능에 맞추어서)
    • displayLie() -> displayHeadLine()
    • onBoardMenu() -> execute()
static void execute() {
    while(true) {
      // 게시판 메뉴 출력
      System.out.println();
      System.out.println("게시판: ");
      System.out.println("  1: 목록");
      System.out.println("  2: 상세보기");
      System.out.println("  3: 등록");
      System.out.println("  4: 삭제");
      System.out.println("  5: 수정");
      System.out.println();
      int menuNo = 
      Prompt.inputInt("메뉴를 선택하세요[1..5] (0: 이전) ");
      displayHeadLine('-');
      switch (menuNo) {
        case 0:
          Print.bye();
          return;
        case 1:
          BoardHandler.processList();
          break;
        case 2:
          BoardHandler.processDetail();
          break;
        case 3:
          BoardHandler.processInput();
          break;
        case 4:
          //메뉴 삭제
          BoardHandler.processDelete();
          break;
        case 5:
          //게시글 변경
          BoardHandler.processUpdate();
          break;
        default:
          Print.wrongMessage();
      }
      displayBlankLine();
    }//게시판 while
  }

나 혼자 문법 정리하기

- Q. public class는 자바 소스 파일 하나당 한 개만 가능한가?

  • 그렇다.
  • 이유: 가독성 때문이다. 클래스가 많아지게 되면 이 클래스가 어느 소스파일에 속해있는지 찾기 어려울 수 있기 때문에 하나의 소스 파일에는 하나의 class만 있는 것이 좋다.
  • 또한 public class명은 자바소스파일의 이름과 동일하게 설정해주어야 한다.

같은 클래스 내부의 static 변수와 메소드 끼리는 바로 호출이 가능하다.

  • 클래스이름.메소드명, 클래스이름.변수명 과 같이 호출할 필요가 없다!!

구글 인터뷰 재현(손코딩)

https://www.youtube.com/results?search_query=%EA%B5%AC%EA%B8%80%EC%9D%B8%ED%84%B0%EB%B7%B0+%EC%9E%AC%ED%98%84

profile
https://github.com/Dingadung

0개의 댓글