여니의 성장 diary
article thumbnail
728x90
반응형

최근 우아한테크코스에 지원하면서 정신없이 보내느라 블로그 기록을 잠시 미뤄왔지만

더 늦기전에 게을리하지않고 차곡차곡 다시 기록을 남겨보기로!

 

어느정도 진도를 끝내고 객체지향 부분을 복습하는 시간을 가졌다 :)


클래스(class)

 

클래스의 기본 개념에 대해 먼저 다시 복습해보았다.

 

1개의 소스파일 내에 여러개의 class를 정의하는 것이 가능하고,

같은 소스파일 내에서 public 접근제한자를 사용하는 class는 소스파일명과

완벽하게 일치하는 이름의 단 1개의 class만 존재할 수 있다.

 

또한 1개의 소스파일 내에서 public class 없이 default class만 여러개 존재하는 것은 가능하고,

각 클래스 파일은 bin폴더(binary)의 자바 파일 내에 존재한다.

 

위의 코드에서 클래스들이 저장된 exam01-Car.java 파일은

exam01 패키지의 class 소스 파일명이 Car인 클래스와 동일한 소스 파일 내에

Car, Tire, Box 클래스 파일이 각각 생성되어 저장된다.

 

이를 확인하려면 클래스 목록에서 Alt+Shift+Enter 단축키를 사용

Resource - Location - Show in System Explorer를 따라가면 확인할 수 있다.

 

Student 클래스 파일은 동일 패키지 내에 존재하는 외부 클래스이다.

 

 

다음은 클래스 내에 필드와 생성자를 정의하고, 메인 메소드에서 사용하였을 때

참조변수와 객체, 각 값의 비교 등의 내용을 정리해보았다.

 

Student 클래스 내에 String 타입의 필드 name과 name을 매개변수로 하는 생성자를 정의하고,

Object에 정의되어있는 equals 메소드를 오버라이딩하여

Student 타입의 객체에서 필드 name과 입력받은 매개변수 name의 실제값이 같으면 true,

실제 값이 같지않은면 false를 반환하도록 재정의하였다.

 

메인메소드에서 Student 타입의 객체를 생성하여 각각 참조변수 s1, s2에 할당해주었다.

이 때 참조변수 s1, s2는 스택(Stack)영역에 저장되고, s1, s2의 객체는 힙(Heap)영역에 저장된다.

 

참조변수 s1과 s2는 "김철수"라는 동일한 문자열을 매개변수로 갖는 객체를 할당하였지만

두 참조변수의 주소값(hashcode값)이 서로 다른 것을 통해

new 생성자를 사용해 새로운 객체를 생성하면 같은 값을 매개변수로하여 객체를 할당하더라도

각각 서로 다른 독립적인 객체임을 확인할 수 있었다.

 

각 참조변수의 값을 출력하여 확인하는 대신에 비교연산자(==)를 활용하면 참조값의 비교가 가능하다.

그리고 객체의 실제값을 비교하기 위해서는 오버라이딩하여 재정의한 equals 메소드를 활용하여

객체의 주소값은 다르지만 같은 문자열을 담고 있다는 것을 확인할 수 있다.

 

동일한 개념으로써 String 타입의 문자열 str1에 "홍길동"이라는 값을 할당하고,

new 생성자를 통해 참조변수 str2에도 동일한 문자열을 할당하였을 때

참조변수 str1, str2의 참조값의 비교 결과는 false이지만 실제값의 비교는 true의 결과를 확인할 수 있다.

 


private접근제한자, 필드, 생성자, enum, toString()

 

이번에는 pivate 접근자를 활용한 필드를 생성하고, 생성자를 통해 매개변수를 입력 받아 필드 초기화,

toString() 메소드 오버라이딩을 통해 외부에서 정보를 출력할 수 있도록 하였다.

그리고 setter를 통해 값을 설정하고, getter를 통해 tax값을 반환하도록 하는 클래스이다.

 

클래스 내에서 모든 필드는 public, protected, default, private 접근제한자를 부여할 수 있고,

해당 클래스에서는 외부에서 접근이 불가능하도록 private 접근제한자를 사용하였다.

또한 직접 생성한 타입도 필드로 활용이 가능한데, enum 타입을 생성하여 필드로 정의하였다.

 

setter에서는 각 건물의 종류에 따라 매입가를 다르게 계산하도록

조건문을 활용하여 각 건물별 매입가 계산식을 각각 다르게 적용하였다.

 

 

열거 타입의 enum은 상수들의 집합이라고 할 수 있다.

상수들을 enum에 정의해두면 오타를 방지할 수 있고, 코드의 가독성을 높이기 때문에

변하지 않는 값은 enum 타입으로 생성 및 정의해서 활용하면 유용하다.

 

 

마지막으로 메인메소드에서 new 생성자를 이용해 여러개의 객체를 만들고,

각 객체에 매개변수 값을 입력해 할당 후 toString()메소드를 사용하면 각 객체의 정보를 출력해서 확인할 수 있다.

 

그리고 setter에 건설된 건물을 전달하고, 매입가를 계산해주도록 호출해주고,

해당 객체의 getter를 호출하면 계산된 매입가를 확인할 수 있다.

 

각 필드는 private 접근제한자를 가졌기 때문에 외부 클래스에서는 직접적인 접근이 불가능하지만

 toString() 메소드 오버라이딩을 통해 각 필드의 정보 출력 및 확인이 가능하고,

 getter와 setter 호출을 통해 각 필드 정보를 불러오고, 값을 재할당(수정) 할 수 있다는 것이다.

 


필드(field), 로컬변수

 

다음으로는 클래스 내에 정의되는 필드와 로컬변수의 개념에 대해 정리하였다.

 

먼저 클래스 내에 정의되는 변수를 필드라고 하고, 필드의 초기화는 선언과 동시에 직접 초기화,

생성자에서 초기화, 매개변수를 통한 초기화를 통해 가능하다.

필드는 접근제한자 설정과 정적 필드 사용이 가능하고, 외부에서 값이 변경되지 못하도록 final 정의도 가능하다.

 

반면에 메소드 내에 정의되는 변수를 지역(로컬)변수라고 하고,

필드의 초기화는 선언과 동시에 직접 초기화, 선언과 초기화를 분리하여 초기화를 할 수 있다.

(예>> int a = 10; => 직접초기화, int a; / a = 10; => 선언과 초기화 분리)

또한 로컬변수는 접근제한자 설정과 정적 필드 사용이 불가능하고,

외부에서 값이 변경되지 못하도록하는 final 정의는 가능하다.

 

덧붙여 클래스에서 정의되는 public static fianl 필드를 상수라고 하고,

상수의 참조변수명은 관례적으로 대문자를 사용하고, 띄워쓰기는 스네이크 표기법('_' 사용)을 따른다.

주의해야할 점은 "public static"을 제외하고 final만 붙여 정의 했다고해서 상수가 아니라는 것이다.

final은 값의 변경이 불가능하도록 할 뿐, public static 없이는 상수로 사용되지 않는다.

 

 

필드와 로컬변수가 사용될 때의 자세한 특성에 대해 한 번 더 정리하였다.

 

필드는 메인메소드에서 객체를 생성한 후에만 사용이 가능하고,

필드는 초기화를 하지않고 정의만 한 경우, 객체를 생성하면서 데이터의 타입에 따라 각각 다른 기본값을 가지게된다.

예를 들어, int타입은 0, double 타입은 0.0, boolean 타입은 false, String 타입은 null 값이 할당된다.

 

반면에 메인메소드 내에서 정의된 로컬변수는 초기화를 하지 않은 경우에 사용 자체가 불가능하다.

그러므로 로컬변수는 반드시 초기화를 한 후에 사용해야한다.

 


생성자 오버로드(Overroad)

 

마지막으로 생성자 오버로딩(Overroad)에 대해 다시 한 번 개념을 익혔다.

생성자 오버로딩과 메소드 오버라이딩은 전혀 다른 개념이라는 것을 반드시 구분해야한다.


먼저 생성자 오버로드의 대상은 Object에 정의된 생성자이다.

모든 클래스는 Object 클래스의 하위 클래스들이고, extends Object가 생략된 형태로 보여지는 것이다.

 

기본 생성자는 매개변수가 있는 다른 생성자가 없을 경우 

컴파일러가 컴파일 시 기본생성자를 자동으로 추가하여 부모클래스의 생성자를 호출한다.

기본적으로 모든 클래스는 기본 생성자에서 Object 클래스의 기본 생성자를 호출하는 것이다.

부모 생성자의 호출은 super()를 활용하는데, 해당 문구를 생략해도 모든 생성자는 이를 포함한다.

 

기본 생성자와 이름이 같고, 매개변수가 있는 다른 생성자를 정의할 경우

매개변수의 타입과 개수가 다르면 각기 다른 생성자로 구분하고, 이를 생성자 오버로딩이라고 한다.

 

이 때 매개변수의 개수가 다르면 서로 다른 생성자로 구분하고,

매개변수의 개수가 같더라도 매개변수의 타입이 각각 다르면 서로 다른 생성자로 구분된다.

 

다만 매개변수의 개수의 개수가 같고, 타입의 순서만 달리하는 것은 같은 생성자로 구분되며,

이런 경우 매개변수의 이름을 변경하더라도 결과는 같다.

728x90
반응형
profile

여니의 성장 diary

@pponyo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!