오버로딩
한 클래스 내에서 사용하려는 이름과 이미 같은 이름의 메소드가 있더라도 매개변수의 갯수나 타입이 다르면 같은 이름을 사용해서 메소드를 정의할 수 있다.
오버로딩의 조건!
- 메소드의 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
(리턴값만 다른것은 오버로딩이 되지 않는다!)
public class 클래스명 {
클래스명() {}
클래스명(String name, String type) {
구현내용;
}
}
생성자를 오버로딩하면 처음 생성자는 default로 존재하고 아래 생성자는 어떤 데이터를 넣어서 초기화 하고싶을 때 추가로 만들면 오버로딩이 되는 것이다.
접근 제어자
클래스의 변수나 메소드의 접근에 제한을 두는 키워드를 말한다.
접근 제어자 종류
- private : 해당 클래스에서만 접근 가능(제한정책상 가장 강력하다.)
- public : 어디서든 접근 가능
- default : 해당 패키지 내에서만 접근 가능 (패키지: 여러 클래스들이 모여있는 각각 구분되는 영역)
- protected : 해당 패키지 및 상속받은 클래스에서 접근 가능
Static
변수나 메소드의 특성을 바꾸는 키워드
Static 키워드를 이용해서 Static 변수와 Static 메소드를 만들수 있으며 다른 말로는 정적 필드와 정적 메소드라고 한다.
이 정적 필드와 정적 메소드는 객체(인스턴스)에 묶여 있는 것이 아닌 클래스에 소속되어 있으며 로더가 클래스를 메모리에 적재할 때 클래스 별로 관리가 되며 클래스의 로딩이 끝난 후 바로 사용이 가능하다.
이 정적인것들은 메모리에 저장이 될떄 static 영역에 저장이 되며 프로그램 종료시 까지 메모리에 남아 존재하게 된다.
Static 특징
- 메모리에 한번만 할당이됨
- Static 변수나 메소드는 공유되는 특성을 가짐
Static 클래스 변수
- 해당 클래스의 각 객체들이 값을 공유
Static 클래스 메소드
- 객체를 생성하지 않아도 호출 가능
직접 실습 해보기
이전 클래스공부 할때 사용했던 car 클래스를 이용해서 오버로드를 실습해 보았는데
기존에 쓰던 printCarInfo를 오버로딩 해서 name, type과 더불어 차번호와 날짜를 받는 형식의 코드를 작성해볼 거다.
이름은 같지만 타입이 다르게 만들어 봤는데 처음은 날짜를 나타내는 date 두번째는 차량번호를 뜻하는 number 마지막으로 두가지의 타입을 같이 받는걸 만들었다.
이후 오버로딩이 제대로 되었는지 확인하기 위해 printCarInfo를 호출해 보았다.
다행히 잘 작동해서 출력이 된 모습을 확인할 수 있었다.
다음으로 접근제어자를 연습하기 위해 강의를 보며 따라 해보았는데
우선 src 폴더에 새로운 패키지(car)를 만들어 준후 새로운 클래스(Car4)을 생성 해주었다.
그리고 Car4 클래스에서 접근제어자로 다른 클래스에서도 접근이 가능한지 확인 하기 위해 public으로 name을 4개 생성해 주었고 생성자로도 만들어 두었다.
이후 원래 Main 클래스에서 Car4에 새로운 객체를 만들고 접근이 가능한지 실행해 보았는데
제대로 출력이 된 모습을 확인할 수 있었다. 일종의 JS에서 사용해 보았던 컴포넌트 개념과 비슷해 어렵지 않게 이해가 되고있다.
이후 다른종류의 접근 제어자도 확인하기 위해 기존에 작성해둔 name중 3가지를 봐꺼보았다.
벌써부터 빨간 글씨가 보여지고 있어 이건 안되는 구나라고 생각하고 있지만 그래도 확인을 위해 Main 클래스에서도 확인을 해보았는데
보이는 바와 같이 붉은 글씨로 접근을 하지 못하는걸 볼 수 있다.
추가로 protected는 상속을 받은 클래승에서는 사용이 가능하다고 하는데 이후 수업에서 실습하면서 겪어 보아야 겠다.
이제 마지막으로 static을 이용해 실습을 해볼건데
기존에 만들어둔 Car3 클래스를 이용해서 static을 실습해보았다.
기존 콛에서 name 변수에 static을 사용해서 객체가 만들어 지기전 name이라는 변수를 먼저 만든다고 한다.
이렇게 static을 사용해 name이라는 변수에 None이라는 값을 할당해 주었다.
이후 getName 이라는 메소드를 하나 만들어 호출하려고 했는데
여기서도 static을 붙이지 않으면 호출이 되지않아
이렇게 static를 붙여주어 작동할 수있도록 해주었다.
출력을 하게 되면 Car nameNone이 호출되는 모습을 확인 할 수 있었다.
여기서 static 메소드로 되어있으면 안에서 사용하는 변수도 static이어야 한다고 한다.
그이유는 위에서 설명한 것과 같이 객체가 생성되기전 부터 메모리에 할당이 되기 때문에 미리 만들어 주어야 한다고 한다.
이제 직접 객체를 만들어서 출력을 시키게 된다면 어떻게 출력이 될지 확인했다.
이렇게 객체를 만들고 출력을 했는데
출력된 결과를 확인해 보면 type은 다르게 나오지만 name은 mac으로 공유되고 있는 모습을 확인할 수 있다.
그 이유는 변수가 static으로 잡혀있으면 객체끼리 공유되는 특성으로 다른객체에서 데이터를 봐꾸어 주면 마지막으로 봐뀐 데이터로 공유되어 모두가 같은 출력결과를 얻게 되는 것을 확인 해 볼수있었다.
간단한 Quiz
test코드를 보면 double 형 데이터를 넣거나 문자형 데이터를 넣거나 3개의 데이터를 넣었을 경우 덧셈이 되도록 오버로딩하라는 문제이다.
우선 주석을 모두 해제하고 오버로딩을 했는데
보이는 바와 같이 첫번째주석은 double 타입으로 만들어 주어 별다른 이상이 없었지만
두번째 주석인 문자열을 받아서 덧셈을 진행하면 12가 되기 때문에 타입변환으로 double타입으로 변환해 주어 a + b가 되도록 만들었다.
세번째 주석은 정말 쉬운부분이라 별달리 설명은 하지않겠다.
이후 출력결과를 확인해 보면
짜잔 보이는바와 같이 정상적으로 뎃셈이 진행되어 출력되는 모습을 확일 할 수 있었다.
'백엔드 > JAVA' 카테고리의 다른 글
JAVA 다형성 (0) | 2023.03.21 |
---|---|
JAVA 상속 (0) | 2023.03.20 |
JAVA 클래스와 객체 #1 (0) | 2023.03.18 |
JAVA 다차원 배열 (1) | 2023.03.17 |
JAVA 참조 타입 (0) | 2023.03.16 |
댓글