오늘부터는 하루하루를 꽉꽉 채워서 바쁘게 보낼 예정!
우테코 프리코스가 시작되는 날이라 설렘과 긴장이 공존하는 상태😣
조금씩이라도 시간이 날때마다 배운 내용을 정리하고 복습하는 시간을 가지고,
그 외 시간에는 다양한 알고리즘 문제를 열심히 풀어보려고 한다 :)
생성자 오버로드, this()
생성자 오버로딩 시 코드를 간략하게 표현할 수 있는 this() 메소드를 사용할 수 있다.
this 메소드는 생성자 내 가장 첫 줄에 위치해야하며, 위의 코드에서 호출되는 this는 Car 클래스이다.
매개변수로 입력받은 값과, 이미 저장된 필드의 값을 동시에 표현할 수 있다.
Line 29 - 32에 3줄로 표현된 코드를 this()를 사용해 한 줄로 표현하면 다음과 같다.
this(model, color, maxSpeed);
메소드 오버라이딩(Override), 익명 객체
간단하게 덧셈과 곱셈을 계산해주는 기능을 하기 위한 Operation 클래스를 생성하였다.
Operator 인터페이스의 기능을 사용하기 위해 Operator 타입의 oper를 필드로 선언해주었고,
이를 매개변수로 하는 생성자를 정의해주었다. (Operator 인터페이스와 구현클래스는 아래에 정리해두었다.)
그리고 결과값 출력을 위해 입력값을 매개변수로 하는 operate 메소드를 정의해주었는데,
결과값에는 Operator 타입의 oper에 정의된 excute 메소드의 결과가 할당되도록 정의해주었다.
매개변수의 값은 외부 클래스, 즉 메인메소드에서 수정할 수 있도록 세터도 생성해주었다!
Operator라는 인터페이스(추상클래스)를 만들고, excute라는 추상메소드를 정의해주고,
Operator를 구현하고, excute 메소드를 오버라이딩하는 AddOperation, MultiOperaion 클래스를 생성하였다.
(인터페이스를 구현하기 위해서는 반드시 해당 인터페이스의 모든 메소드를 오버라이딩 해야한다.)
덧셈, 곱셈에 활용하기 위해 AddOperation 클래스에서는 excute 메소드가 a+b의 값을 반환하고,
MultiOperation 클래스에서는 excute 메소드가 a*b 값을 반환하도록 재정의해주었다.
메인메소드에서 모든 기능이 정상적으로 작동되는지 확인해보았다.
먼저 Operator의 기능을 활용하기 위해서 AddOpeation, MultiOperation 객체를 각각 생성해주고,
입력값을 통해 결과를 갖는 Operation 객체를 생성한 다음 Setter를 통해 객체를 전달하고,
operate 메소드를 호출하면서 값을 전달해주면 원하는 값을 출력할 수 있다.
Line 21에서는 Operation 클래스의 Setter로 add가 전달되고, this.oper에 add가 할당된다.
그리고나서 Line 22에서 operate 메소드를 호출하면 Operation 클래스의 operate 메소드에 입력값 11, 12가 전달되고,
result에는 AddOperation의 execute 메소드의 반환값이 할당되고, println 출력값이 다시 메인메소드로 전달되는 것이다.
구현 클래스를 별도로 생성하지 않고, 메인메소드에서 익명 객체를 생성하여 활용하는 방법도 가능한데
새로운 Operator 객체를 생성하고, 생성자를 통해 객체를 전달하여 결과값을 출력하도록 할 수 있다.
이러한 방법으로 구현클래스를 생성하지 않고, 메인메소드에서 생성된 Operator객체 sub는
메인메소드 내에서 일시적으로 생성되어 사용하고, 다른 클래스에서는 활용이 불가능하다.
이와 같은 객체를 익명 객체라고 한다.
동일 클래스 내 객체 생성 및 메소드 호출
동일한 클래스 내 메인메소드에서의 객체 생성 및 메소드 호출은
객체를 할당할 참조변수를 따로 정의해주지 않아도 new 연산자를 통해 객체 생성이 가능하고,
매개변수를 입력하여 메소드를 호출하여 실행하는 것이 가능하다.
접근제한자 default
마지막으로 접근제한자 default 에서의 접근 가능 범위를 확인해보았다.
default는 동일한 패키지 내 존재하는 class에서만 접근이 가능하도록 허용하는 접근제한자이다.
먼저 접근제한자 public과 default 비교를 위해 class AAA와 BB를 생성하고
메인메소드를 실행할 AAADemo 클래스를 동일한 패키지 내에서 생성해주었다.
(클래스를 생성할 때 public, protected, private 접근제한자를 갖지 않을 경우
default 문구를 생략하여도 기본적으로 default 접근제한자로 간주하는 것을 참고하여야 한다)
메인메소드에서 새로운 AAA 객체와 BB 객체를 생성해보면
public 접근제한자 클래스와 default 접근제한자 클래스 모두 접근이 가능한 것을 확인할 수 있다.
즉, 동일 패키지 내에서는 접근제한자 pulbic, default 클래스의 인스턴스를 모두 생성할 수 있다.
반면 패키지를 새로 생성하여 메인메소드를 실행하는 AADemo 클래스를 생성해주고,
위의 public 접근제한자 BB 클래스와 default 접근제한자 AAA 클래스에 접근이 가능한지 확인해보았다.
default 접근제한자를 가진 클래스의 경우에는 다른 패키지에서 객체를 생성하면 컴파일 오류가 발생하고,
해당 클래스의 객체를 생성할 수 없는 것을 확인할 수 있었다.
즉, AADemo 클래스는 AAA 클래스와 서로 다른 패키지에 존재하기 때문에
AADemo 클래스에서는 AAA객체를 생성할 수 없는 것이다.
그러나 public 접근제한자를 갖는 BB 클래스는 import 해주기만하면
AADemo 클래스에서 BB객체를 생성하여 접근이 가능한 것을 확인할 수 있었다.
'Develop growth diary > JAVA' 카테고리의 다른 글
[프로그래머스 - 두 수의 합] long 타입의 최댓값을 초과하는 정수의 연산 / BigInteger 활용 (1) | 2023.11.23 |
---|---|
📎 'String' 클래스와 'StringBuilder' 클래스의 비교 (0) | 2023.08.25 |
이것이 자바다 6장 클래스 복습 #1 - 클래스, 변수, 생성자 오버로딩 (0) | 2022.10.25 |
자바 기반 객체지향 프로그래밍 08 - 인터페이스(interface) 구현, 추상메소드 (0) | 2022.10.19 |
자바 기반 객체지향 프로그래밍07 - 클래스의 다형성 (1) | 2022.10.18 |