본문 바로가기

개발공부/Java

패스트캠퍼스 환급챌린지 19일차 : 한 번에 끝내는 컴퓨터 공학 & 인공지능 복수전공 초격차 패키지 강의 후기

반응형

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성하였습니다.

 

 

 

 

Ch 4. 배열과 알고리듬

자바 프로그래밍 심화: 배열, 조건문, 반복문, 그리고 클린 코드 작성법 

데이터를 효율적으로 관리하는 배열, 프로그램의 흐름을 제어하는 조건문반복문, 그리고 좋은 코드를 작성하기 위한 알고리즘 및 주석 활용법에 대해 알아보겠습니다.


1. 자바 배열(Array) 이해하기: 데이터 묶음 다루기

컴퓨터 과학에서 배열(Array)은 동일한 메모리 크기를 가진 요소(값 또는 변수)들의 모음으로 구성된 데이터 구조입니다. 각 요소는 하나 이상의 배열 인덱스 또는 키로 식별됩니다. 즉, 같은 타입의 여러 데이터를 하나의 이름으로 묶어 관리할 때 사용합니다.

 

1.1. 배열의 선언, 생성 및 사용

자바에서 배열을 사용하려면 크게 세 단계를 거칩니다.

  1. 배열 선언: 어떤 타입의 배열을 사용할 것인지 선언합니다.
    String[] strings; // 문자열을 저장할 수 있는 배열 변수 선언 [cite: 734]
    int[] numbers; // 정수를 저장할 수 있는 배열 변수 선언
    
  2. 타입[] 배열변수명; 형식으로 작성합니다.
  3. 배열 생성: new 키워드를 사용하여 실제 배열 객체를 메모리에 생성합니다. 이때 배열의 크기(저장할 수 있는 요소의 개수)를 지정합니다.
    strings = new String[7]; // 7개의 문자열을 저장할 수 있는 배열 생성 [cite: 735]
    numbers = new int[5]; // 5개의 정수를 저장할 수 있는 배열 생성
    
    선언과 생성을 동시에 할 수도 있습니다: String[] strings = new String[7];
  4. new 타입[배열 크기]; 형식으로 작성합니다.
  5. 배열 사용: 생성된 배열의 각 요소에 접근할 때는 **인덱스(Index)**를 사용합니다. 배열의 인덱스는 0부터 시작합니다.
    strings[0] = "고객 [이름: "; // strings 배열의 첫 번째 요소에 값 할당 [cite: 736]
    System.out.println(strings[0]); // strings 배열의 첫 번째 요소 출력
    
    numbers[0] = 10;
    numbers[1] = 20;
    System.out.println(numbers[0] + numbers[1]); // 30 출력
    

배열의 길이는 배열 객체의 length 속성을 사용하여 알 수 있습니다.

System.out.println(strings.length); // 7 출력

예제 코드: 고객 정보 배열로 관리하기

이전 Customer 클래스의 toString() 메소드를 개선하여 배열을 활용해 고객 정보를 보다 유연하게 구성해 봅시다.

public class Customer {
    private String name;
    private String number;
    private private String email;

    public Customer(String name, String number, String email) {
        this.name = name;
        this.number = number;
        this.email = email;
    }

    // 이름이 없는 고객인지 확인하는 헬퍼 메소드 (가독성 향상) [cite: 867]
    private boolean hasNoName() {
        return this.name == null;
    }

    // 이메일이 없는 고객인지 확인하는 헬퍼 메소드
    private boolean hasNoEmail() {
        return this.email == null;
    }

    @Override
    public String toString() {
        // 7칸짜리 문자열 배열 선언 및 생성 [cite: 721, 735]
        String[] customerInfoArray = new String[7]; //

        // 배열 요소에 값 할당
        customerInfoArray[0] = "고객 [이름: "; [cite: 736]

        // 이름 유무에 따른 조건 처리 [cite: 762]
        if (hasNoName()) { //
            customerInfoArray[1] = "익명"; [cite: 762]
        } else {
            customerInfoArray[1] = this.name; [cite: 762]
        }
        customerInfoArray[2] = ", 전화번호: ";

        // 전화번호 유무에 따른 조건 처리
        if (this.number == null) {
            customerInfoArray[3] = "모름";
        } else {
            customerInfoArray[3] = this.number;
        }
        customerInfoArray[4] = ", 이메일: ";

        // 이메일 유무에 따른 조건 처리
        if (hasNoEmail()) { //
            customerInfoArray[5] = "모름"; [cite: 762]
        } else {
            customerInfoArray[5] = this.email; [cite: 762]
        }
        customerInfoArray[6] = "]";

        // 배열의 모든 요소를 순회하며 하나의 문자열로 결합 (반복문 사용) [cite: 723]
        String formattedString = ""; [cite: 722]
        for (String part : customerInfoArray) { // 향상된 for 문 
            formattedString += part; [cite: 777]
        }
        return formattedString;
    }

    // 다른 getter 메소드들... (생략)
    public String getName() { return name; }
    public String getNumber() { return number; }
    public String getEmail() { return email; }
}

public class ArrayExample {
    public static void main(String[] args) {
        Customer customer1 = new Customer("김철수", "010-1234-5678", "kim@example.com");
        Customer customer2 = new Customer(null, "010-9999-8888", null); // 이름과 이메일이 없는 고객

        System.out.println(customer1);
        System.out.println(customer2);
    }
}

2. 조건문(Conditional Statements): 프로그램의 의사결정

조건문은 특정 조건이 true일 때만 코드를 실행하거나, 조건에 따라 다른 코드 블록을 실행하도록 하여 프로그램의 흐름을 제어합니다.

2.1. if-else 문

가장 기본적인 조건문은 if 문과 else 문입니다. if (조건) { 문장; } 또는 if (조건) { 문장; } else { 문장; } 형태로 사용합니다. 조건이 true이면 if 블록의 코드가 실행되고, false이면 else 블록의 코드가 실행됩니다. 여러 줄의 코드가 if 또는 else 절에 포함될 경우 중괄호({})가 필요합니다.

// 예시: 숫자의 양수/음수 판별
int number = -5;
if (number > 0) {
    System.out.println("양수입니다.");
} else {
    System.out.println("음수입니다.");
}

2.2. 다른 조건문: switch 문

자바에서는 if-else if-else 구조가 복잡해질 때 switch 문을 사용할 수 있습니다. switch 문은 하나의 변수 값에 따라 여러 경우 중 하나를 선택하여 실행합니다.

// 예시: 요일에 따라 다른 메시지 출력
int dayOfWeek = 3; // 1:월, 2:화, 3:수...
switch (dayOfWeek) {
    case 1:
        System.out.println("월요일입니다.");
        break; // break를 사용하여 해당 case 실행 후 switch 문을 빠져나옴
    case 2:
        System.out.println("화요일입니다.");
        break;
    case 3:
        System.out.println("수요일입니다.");
        break;
    default: //
        System.out.println("다른 요일입니다.");
        break;
}

3. 반복문(Loop Statements): 코드 반복 실행

반복문은 특정 조건이 충족될 때까지 코드 블록을 반복적으로 실행하는 데 사용됩니다.

 

3.1. for 문

for 문은 특정 횟수만큼 반복하거나 배열과 같이 순차적인 데이터 구조를 순회할 때 주로 사용됩니다. 기본 구조는 for(초기화식; 조건식; 증감식) 입니다.

// 예시: 1부터 5까지 출력
for (int i = 1; i <= 5; i++) {
    System.out.println("숫자: " + i);
}

3.2. 향상된 for 문 (for-each 루프)

배열이나 컬렉션의 모든 요소를 순회할 때 매우 유용하며, 코드를 더 간결하게 만듭니다. for (타입 변수 : 배열/컬렉션) 형식으로 작성합니다.

// 예시: 배열의 모든 요소 출력
String[] fruits = {"사과", "바나나", "오렌지"};
for (String fruit : fruits) { // 
    System.out.println("과일: " + fruit); [cite: 777]
}

3.3. while 문과 do-while 문

while 문은 조건이 true인 동안 코드 블록을 반복 실행합니다. do-while 문은 코드 블록을 최소 한 번 실행한 후 조건을 검사하여 반복 여부를 결정합니다.

// while 문 예시: 카운트 증가
int count = 1;
while (count < 6) { // 
    System.out.println("Count is: " + count); [cite: 786]
    count++; //
}

// do-while 문 예시: 최소 한 번 실행 보장
int anotherCount = 1;
do { // [cite: 787]
    System.out.println("Another Count is: " + anotherCount); [cite: 788]
    anotherCount++; //
} while (anotherCount < 6); // [cite: 789]

4. 알고리즘과 주석: 효율적이고 가독성 높은 코드 작성

4.1. 알고리즘(Algorithm)의 기본

알고리즘(Algorithm)은 수학 및 컴퓨터 과학에서 특정 문제 클래스를 해결하거나 계산을 수행하는 데 일반적으로 사용되는, 수학적으로 엄격한 유한한 지시 시퀀스입니다. 도널드 커누스(Donald Knuth)에 따르면 알고리듬의 필수 요소는 순차(Sequential), 반복(Iterative), 비교(Conditional)입니다.

 
  • 순차적 실행: 코드는 일반적으로 위에서 아래로 순서대로 실행됩니다.
  • 비교 알고리즘: 조건문(if, switch)을 사용하여 특정 조건에 따라 다른 경로를 선택합니다.
  • 반복 알고리즘: 반복문(for, while, do-while)을 사용하여 특정 작업을 여러 번 수행합니다.

4.2. 주석(Comment) 활용

주석(Comment)은 컴퓨터 프로그램의 소스 코드 내에서 프로그래머가 읽을 수 있는 설명 또는 주석입니다. 주석은 코드의 이해를 돕지만,

주석보다는 프로그램 코드 자체가 이해하기 수월하도록 작성하는 문화를 지향하는 것이 좋습니다.

자바에서 주석은 다음과 같이 작성할 수 있습니다.

// 이 부분은 한 줄 주석입니다.
  • 한 줄 주석: // 뒤에 작성합니다.
    /*
     * 이 부분은 여러 줄 주석입니다.
     * 다양한 내용을 작성할 수 있습니다.
     */
    
  • 여러 줄 주석: /*로 시작하여 */로 끝납니다.
  • Javadoc 주석: /**로 시작하여 */로 끝납니다. 이 주석은 자바 API 문서를 자동으로 생성하는 데 사용됩니다. @param, @return 등과 같은 태그를 사용하여 메소드, 클래스 등에 대한 상세 정보를 제공할 수 있습니다.
    /**
     * 이 메소드는 문자를 배열로 출력한 다음 줄을 종료합니다. [cite: 850]
     * 이 메소드는 {@link #print(char[])}를 호출한 다음
     * {@link #println()}을 호출하는 것처럼 동작합니다. [cite: 851, 852]
     *
     * @param x 출력할 문자의 배열입니다. 
     */
    public void printChars(char[] x) {
        // ... 코드 구현 ...
    }
    

4.3. 가독성 높이기: 클린 코드 원칙 

좋은 코드는 읽기 쉬워야 합니다. 코드의 가독성을 높이는 것은 유지보수성을 향상시키고 협업을 원활하게 합니다. 켄트 벡(Kent Beck)의 "Tidy First?"와 같은 책에서 강조하는 리팩터링(Refactoring) 개념은 코드를 더 깨끗하고 이해하기 쉽게 만드는 데 중점을 둡니다.

코드 정리 방법 (일부 예시):

  • 갈래를 명료하게: 조건문의 분기가 명확하도록 작성합니다 (예: 보호 구문 사용 ).
  • 명하는 변수/상수: 변수나 상수의 이름을 의미 있게 지어 코드 자체로 설명되도록 합니다.
  • 불필요한 주석 지우기: 코드가 명확하다면 불필요한 주석은 오히려 방해가 될 수 있습니다.
  • 도우미 추출: 복잡한 로직을 작은 도우미 메소드로 분리하여 코드의 역할을 명확히 합니다. (위 hasNoName() 메소드 예시)
  • 응집도를 높이는 배치: 관련 있는 코드들을 함께 배치하여 코드의 응집도를 높입니다.
  • 선언과 초기화를 함께 옮기기: 변수 선언과 초기화를 가까운 곳에 배치하여 변수의 사용을 명확히 합니다.

프로그래밍의 다면적 특성: 프로그래밍은 단순히 명령을 나열하는 것이 아니라, 창작적 측면 (알고리듬을 포함한 줄거리 작성) , 협업적 측면 (다수가 함께 작업하므로 스타일과 리듬을 맞춰야 함) , 엄격한 규칙성 (하드웨어 제약 및 규약 준수) , 그리고 경제성 측면 (수익 활동 가능성) 을 모두 고려해야 하는 복합적인 활동입니다.

 

오늘의 실습

오늘의 느낀점

코드 리팩토링진행. 실무에서도 협업할 때 굉장히 중요하다 생각하는 포인트 중에 하나이다. 동시에 어차피 신경 안써도 코드가 실행되는데는 문제가 없으니 에러만 안나면 놓치기 쉬운 포인트 이기도 하다. 개발자로 취업하고 초기에 클린코드도 읽어보고 했지만, 실제 업무를 하는데 있어서 일정이 빡빡하다는 핑계로 좀 더 읽기 쉬운 코드로 만들지 못하는게 아쉬울 때가 많다. 이제는 다짐만이 아니라 업무 진행할 때도 좀 더 가독성 좋은 코드를 짜야지~ ㅎㅎ

 

 

 

https://fastcampus.info/4n8ztzq

 

(~6/20) 50일의 기적 AI 환급반💫 | 패스트캠퍼스

초간단 미션! 하루 20분 공부하고 수강료 전액 환급에 AI 스킬 장착까지!

fastcampus.co.kr

 

 

반응형