Do it! 알고리즘 입문: 자바 편 (7)[책리뷰 & Book review]
본문 바로가기

컴퓨터공부/책리뷰 & book review

Do it! 알고리즘 입문: 자바 편 (7)[책리뷰 & Book review]

by Life & study 2024. 1. 30.
반응형

 

 

 

Dog myDog = new Dog("멍멍이", 3, 추가 1, 추가 2, 추가 3)에 대한 이해
Do it! 알고리즘 입문: 자바 편 (7)[책리뷰 & Book review]


자바에서 객체를 생성할 때 new 키워드 뒤에 오는 부분은 생성자(Constructor)를 호출하는 부분입니다.

 생성자는 클래스에 정의된 메소드로, 객체를 처음 생성할 때 실행됩니다. 

생성자는 보통 객체의 필드를 초기화하는 데 사용됩니다.

생성자의 매개변수는 객체 생성 시 외부로부터 받아들일 데이터를 정의합니다.

 따라서 Dog myDog = new Dog("멍멍이", 3, 추가 1, 추가 2, 추가 3)에서

                                                 "멍멍이", 3, 추가 1, 추가 2, 추가 3은 Dog 클래스의 생성자가 받아들일 매개변수입니다.

이를 통해 Dog 클래스를 확장해 보겠습니다:

java

public class Dog {
    private String name;
    private int age;
    private String color;  // 추가1
    private String breed;  // 추가2
    private String owner;  // 추가3

    public Dog(String name, int age, String color, String breed, String owner) {
        this.name = name;
        this.age = age;
        this.color = color;  // 추가1
        this.breed = breed;  // 추가2
        this.owner = owner;  // 추가3
    }

    // 나머지 메소드는 생략
}

public class Main {
    public static void main(String[] args) {
        // 객체 생성
        Dog myDog = new Dog("멍멍이", 3, "Black", "Poodle", "John");

        // 나머지 코드는 생략
    }
}


위 코드의 동작 방식은 다음과 같습니다:

Dog 클래스에 color, breed, owner라는 새로운 필드를 추가합니다.
Dog 클래스의 생성자를 확장하여 color, breed, owner도 초기화할 수 있도록 합니다. 따라서 Dog 객체를 생성할 때 이 값들을 매개변수로 전달해야 합니다.
Main 클래스에서 Dog 객체를 생성할 때, "멍멍이", 3, "Black", "Poodle", "John"을 매개변수로 전달하여 myDog 객체의 필드를 초기화합니다.
이처럼 생성자의 매개변수는 객체 생성 시 필요한 데이터를 외부로부터 받아 객체의 상태를 초기화하는 데 사용됩니다.



 

클래스 인스턴스와 필드의 차이점은 무엇인가?

 

 

 

public class Dog {
    // 필드 정의
    private String name;
    private int age;

    // 생성자
    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    // 메소드 정의
    public void bark() {
        System.out.println(name + "가 짖습니다: 멍멍!");
    }
}

public class Main {
    public static void main(String[] args) {
        // 클래스 인스턴스 생성
        Dog myDog = new Dog("멍멍이", 3);

        // 메소드 사용
        myDog.bark();
    }
}

 

인스턴스는 '실체화 ' 한다. 는 개념'

 

인스턴스라는 용어와도 헷갈려하는 경우가 많은데, 인스턴스는 객체를 실체화한 것이라고 보면 된다. 

즉 프로그램 코드 상에서 자료형이 임의의 클래스로 선언된 식별자는 '객체'라 하고, 코드 컴파일 후 프로그램이 실행될 때 해당 객체가 메모리에 적재되면 '인스턴스'라고 불린다.

[11] 어느 단계를 기준으로 하느냐의 차이일 뿐 객체와 인스턴스는 같은 것이라고 할 수 있다.

 

 

 

 

 

 

매개변수의 순서는 상관이 없다?

 

 

인스턴스라는 용어와도 헷갈려 하는 경우가 많은데, 인스턴스는 객체를 실체화한 것이라고 보면 된다. 

 

즉 프로그램 코드 상에서 자료형이 임의의 클래스로 선언된 식별자는 '객체'라 하고

코드 컴파일 후 프로그램이 실행될 때 해당 객체가 메모리에 적재되면 '인스턴스'라고 불린다.

 

[11] 어느 단계를 기준으로 하느냐의 차이일 뿐 객매개변수의 순서는 메서드나 생성자를 작성하는 개발자가 결정하게 되는데, 이는 보통 코드의 가독성, 일관성, 그리고 로직에 따라 결정됩니다.

예를 들어, Dog 클래스의 생성자를 정의할 때, name과 age를 먼저 배치한 이유는 일반적으로 개의 이름과 나이가 가장 중요한 정보이기 때문일 수 있습니다. 그다음에는 색상(color), 품종(breed), 주인(owner) 정보를 위치시킨 것입니다.

이처럼 개발자는 메서드나 생성자의 매개변수를 정의할 때, 해당 메소드나 생성자를 사용하는 다른 개발자들이 쉽게 이해하고 사용할 수 있도록 가독성이 좋고 일관된 순서를 고려하여 매개변수를 배치합니다.

그럼에도 불구하고 순서에 혼동이 생길 수 있으므로, 

개발자는 코드를 작성하거나 읽을 때 메소드나 생성자의 정의를 참조하여 매개변수의 순서를 확인해야 합니다. 또한, IDE(Integrated Development Environment)를 사용한다면, 메소드나 생성자를 호출할 때 IDE가 자동으로 매개변수의 이름과 타입을 표시해 주므로, 이를 통해 순서를 확인할 수도 있습니다.

결국, 매개변수의 순서는 해당 메서드나 생성자를 정의하는 코드를 통해 정확하게 알 수 있으며, 

개발자는 이를 참조하여 매개변수를 전달해야 합니다. 체와 인스턴스는 같은 것이라고 할 수 있다.

 

 

 

 

 

 

 

intelij에서 Debugger 기능은 무엇인가?

 

t는 1이므로 1번째 테스트 케이스입니다. 그리고 디버깅은 26번째 줄을 가리키고 있습니다.
원래 문제에서 요구한 테스트 케이스의 출력 결과는 '몇 번째 테스트 케이스의 답이 무엇이다'
이므로 1 999999와 같이 출력되어야 합니다. 그런데 Console 탭을 보면 5-1875592971
출력하고 있습니다. 분명 1번째 테스트 케이스를 실행하는 중이므로 1이 출력되어야 하는데
그렇지 않습니다. 이는 26번째 줄에서 출력 변수를 t가 아니라 testcase로 지정했기 때문입니
다. 코딩을 하는 도중에 t와 testcase를 혼동했을 가능성이 높습니다.






 

 

 

 

int 타 입고 long 타입은 어떻게 다른가?

 

 int와 long 타입에 대한 차이점을 이해해야 합니다.

 int는 32비트로 표현되며,

 -2,147,483,648에서 2,147,483,647 사이의 값을 가질 수 있습니다. 

 

반면에 

long은 64비트로 표현되며,

 -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807 사이의 값을 가질 수 있습니다.

 이는 훨씬 더 큰 숫자를 처리할 수 있다는 것을 의미합니다.

다음은 int와 long 타입의 차이점을 보여주는 간단한 자바 코드입니다:

java

public class Main {
    public static void main(String[] args) {
        int a = 2147483647; // int의 최대 값
        a = a + 1;
        System.out.println(a); // 오버플로우 발생, 의도치 않은 결과 출력

        long b = 2147483647; // int의 최대 값
        b = b + 1;
        System.out.println(b); // 정상적인 결과 출력
    }
}


위의 코드에서 볼 수 있듯이,

 int 타입의 변수 a에 int의 최댓값을 넘는 값을 더하면 오버플로우가 발생하여 의도치 않은 결과가 출력됩니다.

 반면에 long 타입의 변수 b는 더 큰 값을 처리할 수 있으므로 정상적인 결과가 출력됩니다.

이처럼, 코딩 테스트에서 큰 숫자를 다루어야 할 때는 int 대신 long을 사용해야 합니다. 

또한, 연산 과정에서도 값의 범위를 넘지 않도록 주의해야 합니다.

예를 들어, 곱셈 연산의 경우,

 다음과 같이 두 int 값을 곱한 결과가 int의 범위를 넘어갈 수 있으므로 이를 long 타입으로 변환해주어야 합니다:

java

public class Main {
    public static void main(String[] args) {
        int a = 50000;
        int b = 60000;
        long result = (long) a * b;
        System.out.println(result); // 3000000000
    }
}


위의 코드에서 볼 수 있듯이, 

a와 b의 곱은 int의 범위를 넘어가므로 이를 long 타입으로 변환하여 오버플로우를 방지합니다. 

이처럼 코딩 테스트에서 큰 숫자를 다루어야 할 때는 항상 변수의 타입과 연산을 주의하며 코드를 작성해야 합니다.

 

 

 

반응형

댓글