우당탕탕 개발 블로그 도전기

03.20~03.21[Java] 본문

국비지원 과정 기록

03.20~03.21[Java]

나루나른 2024. 3. 23. 17:17

03.20(수)

 

● Java 생성자 함수

Java에서 생성자 함수(Constructor)는 객체가 생성될 때 자동으로 호출되는 특별한 유형의 메서드이다. 주로 객체를 초기화하는 데 사용함. 객체의 field(변수)에 초기값을 할당하는 작업을 수행한다. 생성자는 기본적으로 클래스의 이름과 동일한 이름을 가지며, 리턴 타입을 지정하지 않음.

overroding이 가능하며, 같은 이름의 생성자를 여러개 정의해 이를 통해서 다양한 방식으로 객체를 초기화 할 수 있다.

 

● this

'this'현재 객체, 즉 현재 인스턴스를 가리키는 데 사용된다. this를 사용함으로써 클래스의 필드(변수), 메서드 및 생성자에 접근할 수 있으며, 주로 현재 객체의 멤버와 메서드 매개변수 또는 지역 변수 사이에 이름 충돌이 있을 때 이를 구분하는 데 사용된다.

현재 인스턴스를 다른 메서드에 전달하기 위해 'this'를 사용하여 현재 객체를 전달 할 수 있다.

 

이처럼 'this' 의 사용은 코드의 가독성을 높이고, 클래스 내에서 멤버 간의 명확한 구분을 제공하여 오류 가능성을 줄이는데 기여한다.

 

 

● String/ equals() 메소드를 이용한 문자열 비교

Java에서 특정한 객체의 값을 비교할 때는 '==' 동등비교 연산자 또는 .equlas() 메소드가 사용된다.

하지만 두 개의 사이에는 중요한 차이가 존재하는데,  '==' 연산자는 두 객체의 참조(메모리 주소)를 비교하여, 같은 객체를 가리키고 있는지 확인하는 반면에, equals() 메소드는 두 객체의 내용(값)이 같은지를 비교한다.

String 클래스에서 equals() 메소드는 객체가 가지고 있는 문자열의 내용 자체를 비교하여, 같으면 true, 다르면 false를 반환한다.

 

각각의 형식에 대한 예제)

public class StringCompareExample {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "Hello";
        String str3 = new String("Hello");
        
        // == 연산자 사용
        //str1, str2는 문자열 리터럴이 이미 문자열 상수 풀에 존재하기 때문에 
        //str2는 str1과 동일한 메모리 위치를 참조한다. 따라서 str1과 str2는 같은 객체를 가리킴
        System.out.println(str1 == str2); // true, 같은 리터럴 문자열을 참조하기 때문에 true
        
        // String 타입의 변수 str3을 선언하고, new 키워드와 생성자를 사용하여 "Hello" 문자열을 할당함
        //해당 방식은 새로운 문자열 객체를 생성하여 이 객체는 Heap 메모리 영역에 저장됨 
        // 결국 str3는 새로운 객체를 참조하기 때문에 같은 내용의 문자열을 가지지만, 다른 객체를 가리킨다.
        System.out.println(str1 == str3); // false, 다른 객체를 참조(메모리 주소가 다름)

        // equals() 메서드 사용
        //equlas의 경우 메모리의 주소가 아닌, 문자열 자체의 내용을 비교해서 둘다 true라는 결과점이 도출됨
        System.out.println(str1.equals(str2)); // true, 문자열의 내용이 같음
        System.out.println(str1.equals(str3)); // true, 문자열의 내용이 같음
    }
}

 

 

● final

Java에서 'final' 은 변경할 수 없는 상수를 정의할 때, 메서드를 오버라이드할 수 없도록 막을 때, 또는 클래스를 상속받을 수 없게 할 때 사용한다.

해당하는 요소가 변경 될 수 없음을 명시적으로 선언하여, 프로그램의 안정성을 높이고 의도치 않은 수정으로부터 보호함.

 

상속을 통한 final에 대한 간단한 예)

class Parent {
    final void show() {//불변하는 값(절대 상수화)
        System.out.println("이 메서드는 오버라이드할 수 없습니다.");
    }
}

class Child extends Parent {
    // 오버라이드 시도 시 컴파일 에러 발생
    // 부모 객체에서 show()라는 메소드를 상속을 통해 참조 할 수는 있지만
    //override를 통해서 재정의해서 재사용 할 수는 없다.
    
    //결론 : 참조는 가능하되, 재정의가 불가능(부모 클래스에서 정의된 그대로 사용해야함.)
    void show() {
        System.out.println("오버라이드 시도!");
    }
}

 

 

 

03.21(목)

● static

'static' 은 주로 클래스 레벨의 변수와 메서드에 사용되며, 정적 변수와 정적 메서드라고 한다.. static을 사용하는 주된 이유는 인스턴스에 속하지 않고 클래스에 속한 멤버를 만들기 위해서인데, 이러한 특징 때문에 static 멤버는 객체 생성 없이 클래스 이름을 통해 직접 접근할 수 있다.

 

● wrapper 

래퍼(wrapper) 클래스는 기본 데이터 타입을 객체로 포장하는 클래스를 의미한다.

기존 자료형을 참조형화 해놓은 클래스로 대부분 'java.lang' 패키지에 선언되어 있다.

Java는 순수 객체 지향 프로그래밍 언어이므로, 때때로 기본 데이터 타입(int, char 등)을 객체로 다뤄야 할 필요가 있는데 예를 들어, 메서드에 데이터를 객체로 전달하거나, 객체만을 요구하는 컬렉션 프레임워크에서 기본 데이터 타입을 사용해야 할 때 래퍼 클래스가 필요하다.

 

기본 자료형에 대한 각각의 참조형 클래스

  • byte - Byte
  • short - Short
  • int - Integer
  • long - Long
  • float - Float
  • double - Double
  • char - Character
  • boolean - Boolean

●상속

상속(Inheritance)은 객체 지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 클래스 간에 코드를 재사용할 수 있게 해준다.

한 클래스가 다른 클래스의 속성(attributes)과 메서드(methods)를 상속받을 때, 상속을 받는 클래스를 하위 클래스(subclass) 또는 자식 클래스(child class)라고 하고, 상속을 하는 클래스를 상위 클래스(superclass) 또는 부모 클래스(parent class)라고 한다.

 

● override

객체 지향 프로그래밍에서 하위 클래스가 상위 클래스로부터 상속받은 메서드를 재정의하는 것을 말한다. 오버라이딩을 통해 상속받은 메서드와 동일한 메서드 이름, 매개변수 리스트를 가지면서도, 하위 클래스에 맞게 메서드의 동작을 변경할 수 있다.

'국비지원 과정 기록' 카테고리의 다른 글

03.26 [Java]  (0) 2024.03.26
03.25 [Java]  (1) 2024.03.25
03.18 ~ 03.19[Java]  (0) 2024.03.20
03 07 ~ 03 15[Oracle DB]  (1) 2024.03.17
02.28 ~ 03.06 (Oracle DB)  (0) 2024.03.10