코딩딩/Java

메소드의 가변 인수와 생성자, 클래스의 속성

전낙타 2023. 6. 29. 22:40

 

학습 목표

 

  • 메소드의 가변 인수에 대해 설명할 수 있다.
  • main() 메소드의 형식과 인수 사용에 대해 설명할 수 있다.
  • 생성자(constructor)의 정의와 사용에 대해 설명할 수 있다.
  • 클래스의 상속에 대해 설명할 수 있다.
  • 오버라이딩(overriding)의 의미와 사용에 대해 설명할 수 있다.
  • 접근 제한자의 종류와 사용에 대해 설명할 수 있다.

학습 내용

 

메소드의 가변인수와 main() 메소드

 

메소드의 가변 인수

 

  • 가변 인수의 메소드는 필요한 만큼 자동적으로 인수를 받을 수 있으므로, 사용자가 미리 인수의 개수를 결정할 필요가 없음.
  • 예를 들어 System.out.println() 메소드에서는 출력하는 인수를 임의로 지정할 수 있음.
  • 인자를 배열명으로 받아 메소드 내부에서는 배열 형태로 처리함
  • … 세게의 점들은 빈칸 없이 붙여서 씀

간단한 예

 

응용

 

main() 메소드

 

main() 메소드 형식

 

  • main() 메소드는 프로그램을 실행할 때 최초로 호출되는 메소드로 한 개만 기술할 수 있음
  • 실행되는 프로그램에는 main() 메소드가 반드시 한 개가 있어야 함
  • public 접근 제한자는 임의의 클래스 (객체)로부터도 접근할 수 있다는 것을 의미함
  • static 예약어는 객체 생성없이 실행할 수 있다는 것을 의미함
  • static 예약어가 있어도 객체를 생성한 후 실행할 수 있음
  • C 언어의 main(int argc, char *argv[]) 와 유사하게 동작함
  • static 메소드를 선언해주어 객체 없이 호출하는 모습

 

커맨드 라인 인수 가져오기

 

  • main(String[] args) 메소드의 인수는 String 클래스의 배열로 되어있음
  • args 인수는 커맨드 라인으로부터 입력을 문자열 배열로 받아들임
  • args는 배열명이므로 사용자가 바꿀 수 있지만 흔히 arguments의 줄임말로서 사용함

 

인수가 3개 할당된 모습

 

생성자(constructor)

 

  • 생성자라는 메소드는 오브젝트를 생성할 때 실행되어 주로 초기화 작업을 수행하도록 작성함
  • 생성자의 이름은 클래스 이름과 동일해야 하며 리턴값이 없으므로 리턴값 자료형은 없음
  • 생성자는 필요한 경우 인수를 전달받거나 오버로딩이 가능하지만 리턴 값은 없음
  • 생성자는 다른 메소드처럼 호출할 수 없고 new 연산자를 이용해서 오브젝트를 생성할 때 호출됨
  • 생성자가 정의되어 있지 않으면 디폴트 생성자가 자동으로 만들어져 오브젝트를 생성함

 

인수가 없는 생성자

 

생성자가 호출되어 a,b,c가 값을 가지는 모습이다.

 

인수가 있는 생성자

 

전달된 인수를 이용해서 필요한 필드들을 초기화함

float d는 초기값이 없어 0.0으로 출력됨

여기서 인수의 개수가 서로 다르면 컴파일 오류가 발생한다.

한개의 값만 초기화 하고 싶다면 메소드의 오버로딩으로 해결할 수 있다.

인수의 자료형이 다르면 컴파일 오류가 발생한다.

이 역시 오버로딩으로 해결 가능하다.

 

생성자의 오버로딩

 

생성자도 메소드이므로 오버로딩 (중복 정의) 가 가능함

필요에 따라 인수의 개수에 따라 초기화 하는 목적으로 사용함

인수를 입력하지 않으면 각 int값이 디폴트값인 0으로 출력되는것을 볼 수 있다.

 

디폴트 생성자(default constructor)

 

생성자를 기술하지 않는 경우, 인수가 없는 생성자가 컴파일러에 의해 자동적으로 만들어짐

디폴트 생성자는 아무런 내용도 없음

실제로 기술하지도 않는다.

 

복제 생성자(copy constructor)

 

복제 생성자는 동일한 클래스의 오브젝트를 인수로 받아서 대응하는 필드에 값을 대입하는 생성자임

한 오브젝트의 필드값을 동일 클래스의 여러 오브젝트에 필드들을 복사해서 오브젝트들을 생성하는 용도로 사용됨

 

클래스의 인자로 입력받은 필드값을 그대로 복사해 내가 원하는 필드값만 변경해주는 코드다.

 

클래스 상속

 

클래스 상속의 개념 (중요)

 

  • 클래스에는 다른 클래스의 맴버를 계승하는 기능이 있는데 ‘클래스 상속’ 이라고 함
  • 상속받은 클래스에 멤버를 추가할 수 있음
  • 상속하는 클래스는 부모 클래스 (상위 클래스, 슈퍼 클래스)라고 하고 상속받는 클래스는 자식 클래스(하위 클래스, 종속 클래스, 서브 클래스) 라고 함
  • 하나의 슈퍼 클래스에서 여러 서브 클래스를 만들 수 있음
  • 서브 클래스는 자신이 또 다른 서브 클래스들을 만들 수 있으며, 이 서브 클래스들의 슈퍼 클래스가 됨

 

클래스 상속의 정의

 

  • 서브 클래스를 만들기 위해서는 extends 라는 키워드를 사용함
  • 서브 클래스를 정의할 때 extends 다음에 슈퍼 클래스 (부모 클래스)의 이름을 씀

Animal 생성자, Cat 생성자, cat 오브젝트 모두 순서대로 생성된 모습이다.

 

클래스가 여러 서브 클래스로 상속한 경우

 

오버 라이딩

 

오버라딩의 정의

 

  • 슈퍼 클래스로부터 상속된 메소드와 동일한 이름, 동일한 인수를 갖는 메소드를 서브 클래스에서 재정의 하는 것
  • 형식이 같은 메소드를 가지고 슈퍼 클래스에서는 A라는 작업을 하고 서브 클래스에서는 B라는 작업을 할 때 사용함
  • 슈퍼 클래스에서 메소드의 틀만 만들어 두고 서브 클래스로 상속해서 구체적인 처리 내용을 재정의 해서 사용하라는 용도로 이해할 수도 있음

 

오버 라이딩이 적용되어 안녕히 계세요가 출력된다.

 

오버 라이딩과 super

 

  • 서브 클래스 안에서 오버라이딩 된 메소드가 잇고, 슈퍼 클래스의 메소드를 호출할 때 사용함
  • 메소드 앞에 super.을 붙여서 ‘super.메소드이름’ 과 같이 호출함

 

super.bye 로 인해 슈퍼 클래스의 메소드와 서브 클래스의 메소드가 모두 호출되었다.

 

접근 제한자

 

접근 제한자의 정의

 

  • 접근 제한자는 클래스, 메소드, 필드, 생성자를 정의할 때 각각의 앞에 붙여서 선언됨
  • 접근 제한자를 사용해서 한 오브젝트의 필드, 메소드, 생성자에 대해 다른 오브젝트로부터 접근 방식을 결정할 수 있음
  • 데이터를 직접 접근하는 것보다 메소드를 통해 접근하도록 하는 것인데 데이터의 은닉을 목적으로 함
  • 정의된 클래스들은 기본적으로 하나의 그룹 단위로써 유지되는데 이를 ‘페키지’ 라고 함
    • 여기에서는 단순하게 하위 디렉토리의 다른 파일에 기술된 Java 파일이라고 간주함
  • 여기에서는 하나의 패키지 내에서 동작하는 접근 제한자에 대해 예제 프로그램을 작성하고 설명함

 

public 접근 제한자

 

  • 같은 클래스, 서브 클래스, 같은 패키지 또는 다른 패키지 내에 있는 어떤 클래스에서도 접근할 수 있음
    • 접근에 대한 제한이 없음
  • 이 접근 권한은 클래스 또는 오브젝트의 외부 인터페이스를 제공해 줄 때 주로 사용함
  • 하나의 패키지 안에서는 protected, default 접근 제한자와 동일함

 

protected 접근 제한자

 

  • 같은 클래스, 서브 클래스, 같은 패키지에서 접근할 수 있음
  • 다른 패키지에서는 접근할 수 없지만 상속은 가능함(메소드는 오버라이드해서 사용)
  • 동일 클래스(하나의 패키지 안에 있음) 라면 public, default 접근 제한자와 동일함

 

default 접근 제한자

 

  • 클래스, 메소드, 필드, 생성자 정의 앞에 아무것도 붙이지 않으면 default 접근 제한을 지정한 것임
  • 클래스와 같은 패키지 내에 있다면 다른 클래스(의 오브젝트)에서 접근 가능함
  • 동일 패키지 내의 상속된 서브 클래스에서도 접근 가능함
  • 다른 패키지의 클래스에서는 상속이 불가능함

 

private 접근 제한자

 

  • 한 오브젝트(클래스) 내에서만 접근 가능하고 다른 오브젝트에서는 접근할 수 없음
  • private 멤버에 대한 접근을 시도하는 코드가 있으면 컴파일 시 에러가 발생함
  • 클래스도 private이라고 지정할 수는 있지만 프로그램 내의 코드에서 해당 오브젝트를 접근할 수 없어 의미가 없으므로 사용하지 않음

 

예시 1번

 

상속을 해도 접근이 불가능하다.

 

상속 시 슈퍼 클래스의 생성자 private으로 지정하면 서브 클래스의 오브젝트를 생성할 수 없음