아침 알고리즘
- 비트 연산자의 특징
- OR(|)
- AND(&)
- XOR(^)
- XOR과 비트 연산의 특징
- 결합법칙을 만족
- 교환법칙을 만족
- 시간 복잡도
-- 패리티 비트와 XOR 연산자
- x & (x-1): 최하위 비트에서 1 값을 갖는 비트를 0으로 만드는 공식
본 수업
인스턴스 메서드와 연산자
클래스 문법 활용: 메서드를 묶어 분류하기
- 메서드를 클래스로 묶어 분류해 놓으면 좋은 점?
- 관련된 메서드가 한 클래스에 묶여 있기 때문에 소스코드를 유지보수 하기가 쉬워진다.
- 다른 프로젝트에서 메서드를 재사용하기가 쉽다.
- 클래스 변수 = static 변수
- method의 작업결과를 외부에 두지 말고, 기능별로 method를 묶은 class 내부에서 관리하자 ==> 유지보수가 쉽다.
- 그 method의 작업결과를 외부 변수에서 관리하면 불필요하게 길을 돌아가는 것과 같다.
- 클래스 변수는 new 명령으로 생성하지 않는다.
- 클래스가 메모리에 로딩될 때 자동으로 Method Area 영역에 생성된다.
- static method는 this 사용 불가하다.
- 클래스 변수와 인스턴스 변수
class A{
int a;
int b;
static int c;
void m(){
...
}
}
A obj1 = new A();
A obj2 = new A();
- Method Area
- 모든 명령어 생성
- Method 생성
- class 변수(static 변수) 생성
- JVM Stack
- Heap
- new 했을 때, instance변수만 생성
- heap에는 method 생성 X
- 클래스 변수의 한계
- 클래스 변수는 오직 한 개만 존재하기 때문에 여러개의 작업을 동시에 진행할 수 없다.
즉, 한 개의 식을 계산하고 다른 식을 계산하고자 한다면, 초기화를 하고 진행하여야 한다.
- 따라서 이런 경우, INSTANCE(non-static) 변수를 사용한다.
- instance 변수
- 작업 결과를 개별적으로 관리하고 싶을 때 인스턴스 변수로 선언한다.
- 직접 접근이 안되고 항상 new로 객체를 만들어서 인스턴스 주소를 만들어 접근할 수 밖에 없다.
- static 메소드에서 인스턴스 변수를 다루기 위해서는 작업을 수행할 때, 그 인스턴스의 주소를 받아야한다.
-> 인스턴스 변수는,
static 변수가 아니기 때문에 직접 접근이 안되고,
오직 인스턴스 주소를 통해서만 접근할 수 있기 때문이다.
- 인스턴스 변수와 인스턴스 메소드
- 인스턴스 변수를 다룰 때는 인스턴스 메소드를 사용하는 것이 좋다.
-> 따로 인스턴스의 주소를 파라미터로 받을 필요가 없기 때문이다.
- 메서드를 호출할 때 앞쪽에 인스턴스 주소를 이미 지정한다.
Calculator c1 = new Calculator();
c1.plus(2);
- 메서드를 호출할 떄 앞쪽에 지정한 인스턴스 주소는 this 라는 내장 변수에 자동으로 저장된다.
- 인스턴스 변수를 안쓰는 메소드라면 그냥 클래스 메서드로 두는 것이 좋다.
- 패키지 멤버 클래스
- 패키지 멤버 클래스로 클래스 분류
- 여러 곳에서 사용할 클래스라면, 패키지 멤버로 만드는 것이 유지보수에 좋다.
- 클래스를 역할에 따라 패키지로 분류하기
- 패키지가 달라졌으므로, import 이용
- import: 클래스를 쓰기전에 패키지 소속을 컴파일러에게 알려준다.
board-app 프로젝트 수행
리팩토링: 함수 추출 및 함수 옮기기
- 게시판을 추가할 수 있도록 메뉴 구조를 정리
- 메뉴에 따라 사용자 입력을 다루기: 메소드 추출
- 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();
}
- 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();
}
}
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();
}
- 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();
}
}
나 혼자 문법 정리하기
- 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