[Intel] 11주차 회고록

LHW·2023년 9월 19일
0

Intel교육과정

목록 보기
11/15

Intel AI for Future Workforce 11주차 회고록

☝️ 클래스

이번 주차는 클래스와 함께 시작했다. 흔히들 클래스를 붕어빵 틀에 비교하곤 한다. 매번 들을 때 마다 정말 찰떡이라고 생각한다 😊

클래스를 구성하는 요소로는 필드, 생성자, 메소드가 있으며 각 아래와 같은 역할들을 한다.

🛤️ 필드

필드는 클래스 내부에서 사용할 멤버들을 정의하는 구간이다. 이번에 사용해본 멤버들로는 static member, instance member, final member가 있으며 차이점은 아래와 같다.

  • static member : 객체에 의존하지 않고, 클래스 자체에 의존하는 멤버이다. 따라서 객체가 사라져도 값이 사라지지 않고, 참조 시에도 objectName.member가 아니라 ClassName.member로 참조한다. 그리고 외부에서 참조는 가능하지만, 값 수정은 불가하다.

    이로서 여러 클래스에서 한 변수를 공유할 수 있다는 장점이 있다고는 하셨지만 어떤 느낌인지 크게 와닿지는 않았다.

  • instance member : 객체에 의존하는 멤버로, 객체가 사라짐에 따라 값도 함께 소멸한다. 외부에서 값 참조와 동시에 수정도 자유롭게 가능했다.

  • final member : 수정이 불가한 멤버로, 객체를 통해 접근하여 뭔가 새로운 값으로 수정하는 것이 불가하다.

상수의 경우, static과 final의 특징이 합쳐질 때 상수화 된다. 아래와 같이 사용한다.

final static int E = 2.14;

🌁 생성자

생성자는 클래스를 정의할 때 특정 인자값을 전달받아 업데이트하거나, 그 인자값의 형태를 바꾸거나 하는 등의 행동들을 선행 처리하는 구간이라고 할 수 있다. Java내부에 아무런 인자값과 행동이 없는 생성자를 기본적으로 가지고 있어 필수적으로 정의해 줄 필요는 없지만, 필요에 따라 따로 정의해 주어야 한다.

이 때 생성자 오버로딩을 사용해 보았으며, 오버로딩을 통해 다형성을 갖추고, 일부 겹치는 인자값들에 대해 불필요하게 코드가 길어지는 현상을 방지할 수 있었다.

생성하는 방법은 아래와 같았다.

public MyClass(String userInput){
	// 사용자가 입력하는 문자열에 대해 불필요한 문자들을 제거하고 정수 배열로 전환하는 생성자
	String[] strArr = userInput.replaceAll("[^0-9,]", "").split(",");
    
    this.numArr = new int[strArr.length]
    for (int i = 0; i < this.numArr.length; i++){
    	this.numArr[i] = Integer.parseInt(strArr[i])
    }
}

🕹️ 메소드

클래스 내부에서 정의되는 함수들을 말한다. 인자값을 전달받아 특정한 행동을 수행하는 영역이다. 메소드도 마찬가지로 메소드 오버로딩을 통해 여러 형태의 인자값을 전달받아 각 인자값의 형태가 다를 때 같은 메소드 네이밍일지라도 다른 행동들을 수행하게끔 하는 실습도 진행해 보았다. 예시로 만들었던 행렬 연산 클래스는 아래와 같았다.

    int[][] mulMatrix(int userInput){
        int[][] result = new int[this.rowCnt][this.colCnt];

        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                result[i][j] = userInput * matrix[i][j];
            }
        }
        return result;
    }

    int[][] mulMatrix(MatrixMachine x){
        if (this.rowCnt != x.colCnt){
            System.out.println("입력한 1번째 행렬의 행의 수와 2번째 행렬의 열의 수는 같아야 합니다.");
            return null;
        }
        int[][] result = new int[this.rowCnt][x.colCnt];

        for (int i = 0; i < this.rowCnt; i++) {
            int idx = 0; // 인덱스 증감을 위한 변수
            for (int j = 0; j < x.colCnt; j++) {
                int value = 0; // 합계를 담을 변수

                for (int k = 0; k < this.colCnt; k++) { // 후행 행렬의 열 개수만큼 연산 시행
                    value += matrix[i][k] * x.matrix[k][idx];
                }
                idx ++; // 인덱스 증가
                result[i][j] = value; // 위치에 값 할당
            }
        }
        return result;
    }

💰상속

부모클래스에 정의된 필드, 메소드, 생성자를 상속 받음으로서 자식 클래스에 별도로 정의된 구성요소가 없다 하더라도 부모 클래스에 있는 구성 요소들을 모두 사용할 수 있게 된다. 일반적으로 더 많은 기능을 구현하기 위해서 상속을 받는 경우가 많다고 하셨다.

public class CandyStoreCustomer extends CandyStoreData{ // 상속
    private int point = 0;
    private int grade = 0;
...

위에서 보았던 오버로딩같은 경우 같은 클래스 내에서 같은 이름으로 생성자나 메소드를 재정의하는 행위를 일컫는 개념이었지만, 오버 라이딩의 경우 자식 클래스에서 부모 클래스에 있는 생성자나 메소드를 재정의 하는 행위를 이야기했다.

느낀 점

이전에 사실 혼자서 자바를 해보기도 했지만 그 때 당시에는 '한 언어를 어느정도 할 줄 알면 다른 언어를 배울 때 큰 어려움이 없다'라는 말에 공감을 못했지만 지금 어느정도 파이썬을 다룰 수 있게 되면서 자바를 다시 보다보니 일부 공감하게 되었다.

매번 새로운 언어를 배움에 있어서 큰 두려움이 있었는데 이번에 자바를 배우면서 되게 재미를 느끼면서 배우고 있다.

어려운 점을 머리 싸매면서 해결하는 과정도 재밌고 새로운 구조나 패턴을 배우는 것도 재밌고 새로운 문제를 푸는 것도 재밌고 ... 그렇다

열심히해야지... 히히..

profile
하루가 다르게 성장하기

0개의 댓글