가쟤의 해변일기 🐳

풀스택과정 2주차 - JavaDoc | Array | 가위바위보 리팩토링 팀작업 본문

풀스택과정

풀스택과정 2주차 - JavaDoc | Array | 가위바위보 리팩토링 팀작업

바닷가쟤 2025. 4. 16. 22:22

오늘 JavaDoc이라는 걸 처음 배웠다 ! 

JS에도 비슷한 걸 했던 것 같아서 찾아봤더니 거의 똑같았다.

이 주석을 달면 html 문서를 만들어주는건데, 되게 신기했다ㅎㅁㅎ

오늘 팀작업이 있을거라고 했는데 되게 좋은 기회였던 것 같다.

배우는게 너무 재밋고 행복하다. . . 

칭찬도 받으니까 더 욕심이 나고 잘하고 싶다...


JavaDoc

Java document 주석은 /** */ 안에 {@} 형태로 작성하는 주석이다.

JAVA 소스코드에서 API 문서를 html 태그형식으로 작성하게 해주는 도구이다.

컴파일 시 주석은 제거되므로 성능에 문제는 없다고 한다.

package com.edu.bank;

/**
 * {@code
 * Account 클래스는 계좌 관련된 정보를 가지고 있는 클래스
 * 해당 클래스에서는 Java Document 주석을 달아서 처리했다.
 * 아래에서 사용된 주석은 가장 많이 사용되는 주석이다.
 * }
 * 
 * @author yuna
 * @version project version 1.0.2
 * @since JDK17
 * 
 */


public class Account {
	/**
	 * 계좌번호 12자리 정수형
	 */
	private int accNumber;
	/**
	 * 은행명
	 */
	private String bankName;
	/**
	 * 계좌에 남아있는 잔액
	 * 계좌를 개설할 때 최초 입금 금액
	 */
	private double balance;

	/**
	 * 기본 생성자
	 */
	public Account() {
	};

	/**
	 * 명시적 생성자
	 * @param accNumber 계좌번호
	 * @param bankName 은행명
	 * @param balance 잔액
	 */
	public Account(int accNumber, String bankName, double balance) {
		this.accNumber = accNumber;
		this.bankName = bankName;
		this.balance = balance;
	}

	/**
	 * 
	 * @return 통장정보(계좌번호, 은행명, 잔액을 문자열로 반환)
	 */
	public String getAccountInfo() {
		return accNumber + "\t" + bankName + "\t" + balance;
	}

	/**
	 * 
	 * @param amt 입금할 일정 금액
	 * 특정 금액을 입금하는 기능
	 * 1천원 이상의 금액만 입금이 가능
	 */
	public void deposit(double amt) {
		balance += amt;
	}

	/**
	 * 
	 * @param amt 출금할 일정 금액
	 * 특정 금액을 출금하는 기능
	 * 잔액보다 더 큰 금액이 출금될 시 예외 발생
	 */
	public void withdraw(double amt) {
		balance -= amt;
	}

	/**
	 * 
	 * @return 잔액을 반환
	 */
	public double getBlance() {
		return balance;
	}
}

 

이렇게 작성할 수 있다.

메서드 위에서 /** 엔터를 하면 바로 @로 만들어준다.

이클립스 상단에 project > Generate javaDoc를 누르고

-locale ko_KR -encoding UTF-8 -charset UTF-8 -docencoding UTF-8

이건 한국어를 인식시키기 위해 추가해준 것이다. 저기에 붙여넣기!

 

Finish를 하면 폴더 경로에 /doc이 만들어지는데, 그 안에 overview-tree.html(index.html을 눌러도 된다)을 우클릭

→ Open with → Web browser를 누르면

html 웹브라우저 창이 뜬다.

필드는 private인데, 그럼 이 문서에서 볼 수가 없다.

문서 만들 때 잠깐 . . public으로 하고 문서를 만들면 된다 !


팀작업 - 가위바위보 리팩토링

그리고 강사님이 주신 가위바위보 게임의 기존 코드가 있는데,

이걸 팀으로 리팩토링 해보는 작은 프로젝트를 진행했다.

 

test클래스에 모든 기능이 구현되어있던 기존 코드에서, 클래스를 하나 더 만들어서 기능 분리 -> 구조를 유지보수 하기 좋게 만드는 것이 과제였다.

강사님은 혼자하는 것보다 협업해서 좋은 점을 깨닫길 바라셨던 것 같다.

기능 개선보다는 어떻게 문제에 접근했고, 협업하며 이 문제를 어떻게 해결했는지를 중점으로 과제를 해결해야겠다는 생각이 들었다.

일단 모두에게 코드에서 문제가 될 부분을 찾아서 말해달라고 했다.

개선 방향까지 A4용지에 받아 적었다. 

그러고 한 사람이 타이핑을 하고 계속 의견을 내는 식으로 리팩토링을 진행했는데, 

while 문을 test 클래스에 남기고 분리한 클래스에서 로직을 처리, 그리고 setter 활용을 제안해서 전체적인 틀에 관한 아이디어를 많이 냈다.

다양한 아이디어를 냈는데, 잘못된 방식을 말했을 때 팀원분들이 그 방식은 아닌 것 같다고 바로 말해줘서 좋았다.

하지만 처음에 각자 리팩토링을 해보고, 한명씩 보고, 코드 리뷰를 하고 좋았던 방식을 합치고 발전시켜서 했다면 어땠을까 라는 아쉬움이 남았다.

내가 생각하지 못할 부분도 팀원분들이 잘 생각해내 주셔서 성공적으로 완성했다 !

그리고 점심을 다른 조원들까지 다같이 먹고 바로 발표 시간이었다.

다른 조들 발표를 들으면서 열심히 메모를 해뒀다.

 

[다른 조들의 발표에서 좋았던 점, 아쉬웠던 점, 배울 점 등]

1조

프로젝트에서 필요한 기능을 나눠놓고, 필요한 기능이 있으면 만드는 식으로 진행

입력기능, 게임기능, 결과출력 크게 3가지 기능

setter 있는 것들 다 getter를 만든 것 같은데 필요한가?? -> 너무 짧게 봐서 안 쓴건지 잘 모름

모드를 defaultMod, majorityMod 두 가지로 했음. switch로 모드 설정을 해줌

게임 횟수를 정해주는 메소드도 Player 클래스에 넣음

가위 바위 보를 1,2,3으로 설정하여 입력값에 따라 +1, +2 하는 로직으로 재사용함

rockPaperScissors 메서드에서 왜 return을 계속 1, -1로 하는지??

→ 가위, 바위, 보 이외의 값이 있으면 -1 반환해서 i가 증가하지 않도록 작성함

  • 우리 조랑 다른 점: 명시적 생성자로 Player 초기화
  • 좋았던 점: 변수명 설정을 알기 쉽게 한 것 같다, 게임 로직을 간결하고 재사용성이 좋은 것 같다.

2조

코드 해석 → 부족한 부분 생각(하나씩 읽어 나감), 노트에 클래스 다이어그램을 그림 → 플레이어 클래스, 게임 클래스 2개로 구성 → 필드와 메소드 고민 → 플레이어가 여러 명인 것 X 클래스 1개로 변경 → 주석으로 스캐너 부분, 함수 부분, 반환/출력 부분으로 3가지로 나눔 → while문과 변수 위치 고민 → 종료 조건 2가지** → 최대 판수 지나면 break → 게임을 판단하는 메소드에서 string으로 반환

  • 우리 조랑 다른 점: 랜덤값을 test 파일에 넣고 인자로 넘겼다, 로직 관련 부분은 모두 getter로 만들었다.
  • 좋았던 점: 클래스 다이어그램을 그린 것, 기능을 다 메소드로 뺀 것, 여러 명의 의견 협의 과정을 짚어 설명했던 것
  • 궁금한 점: 간단한 것도 다 메소드로 빼는 것이 좋은지? -> 강사님이 너무 많이 분리하는 것은 쉽지만 바람직하지 않다고 함, 적당히 하는게 어렵다고 !

발표를 강사님의 의도에 맞게 잘 해준 것 같다 !! 인상 깊었던 조다.

 

3조(우리조!!)

  • 아쉬운 점: 메서드는 무조건 소문자로 시작, 클래스만 대문자

4조

게임 로직을 숨김(캡슐화) ← 발표에서 언급함

변수명을 알기 쉽게 선언함

judgeWins(몇판 당 이겨야 하는 횟수 변수도 있음)

isFinished 변수로 게임이 끝나는 경우 따로 관리함

Player객체가 아닌 Game 클래스를 만듬 ←이게 변수명이 더 적합한듯

발표 시 고민했던 부분을 설명함

 

강사님의 피드백

다양한 생각, 아이디어, 힘이 장기적으로 좋다.

노트, 종이로 먼저 스케치해서 → 노션으로 체계화

잘게 쪼개는 것은 쉬우나 적당히 쪼개는 것이 어려운데 이게 중요함 !

고민을 오래 하는 것이 중요하다(깊이 있는 생각).

 

강사님이 코드 잘 짰다고 하셔서 기부니 좋다. 

짜면서 게임 로직을 더 간단히 구현할 방법이 있었던 것 같은데, 시도하지 못해서 아쉬웠다. 

이걸 1조에서 잘 해서 인상깊었다!


배열

같은 데이터타입을 가지는 서로 다른 값들이 하나의 변수를 통해서 한번에 처리되는 것이 배열이다.

배열은 객체다 !!

  • 선언, 생성

int[] arr = new int[3];

이렇게 생성한다.

  • 초기화

메모리 = JVM = 플랫폼

arr[0] = 1 …

  • 선언, 생성, 초기화 한 번에

int[] arr = {11, 22, 33};

배열은 클래스가 아니기 때문에 클래스의 멤버인 필드와 메소드가 없다.

		// for문으로 배열 안의 정보 출력
		for(int i = 0; i < arr.length; i++)
 			System.out.println(arr[i]);

		
		// 뭐가 어디에서 돌아가는가?
		for(int value : arr)
			System.out.println(value);

둘 다 같은 것인데, 아래 for문이 성능이 더 좋다고 한다.

package com.edu.array.test1;

public class BasicArrayTest3 {
	public static void main(String[] args) {
		// 1. 배열 생성
		// 배열은 여러 값을 가지고 있으니 s <- 복수형으로 사용하는 것이 좋다.
		int[] scores = {86, 92, 94, 78, 80, 76};
		
		// 2. 성적들의 총점
		// scores의 값을 추출하는 것이니 단수형으로 사용하면 좋다. scores -> score
		int sumScores = 0;
		for(int score : scores)
			sumScores += score;
		System.out.println("총점 : " + sumScores);
		
		// 3. 평균 성적
		// 다시 사용하지 않는 이상 변수를 선언해서 담을 필요가 없다.
		System.out.println("평균 성적 : " + sumScores / scores.length);
	}
}

강의 방식이 탑다운인 것 같아서 좋다.

구조적으로 중요한 것과 용어를 정확히 정리해서 계속 강조하시고,

처음부터 구조를 짜는 법, OOP를 설계하는 법을 알려주셔서 실력이 많이 늘 것 같다.

복습도 잘 하고 꾸준히 메모해서 꼭.. 좋은 회사에 합격해야지!!!

728x90