Java 프로그래밍기초 230221 #7 매개변수/static/오버로딩/생성자/this/초기화

김춘복·2023년 2월 21일
0

Java 공부

목록 보기
10/20

객체지향 Part.1 이어서

기본형 매개변수와 참조형 매개변수

  • 매개변수(parameter, 파라미터) : 함수를 정의 할 때 함수에 사용되는 변수.
    int add(int x, int y)할때 int x와 int y가 매개변수

  • 기본형 매개변수: 메서드의 매개변수 타입이 기본형.
    변수의 값을 읽기만 할 수 있다.(read only)
    메서드 내에서 매개변수 값을 바꿔봐야 지역변수이기 때문에 메서드가 종료되면 원래대로 돌아간다.

  • 참조형 매개변수: 메서드의 매개변수 타입이 참조형.
    변수의 값을 읽고 변경할 수 있다.(read & write)
    메서드 내에서 매개변수가 참조형으로 들어오고 값을 바꾸면 해당 참조형변수의 주소에 가서 값을 직접 바꾸기 때문에 메서드가 종료되도 바꾼 값이 유지된다.


static 메서드와 인스턴스 메서드

  • static 메서드 (클래스 메서드)
    : 객체 생성 없이 클래스이름.메서드이름()으로 호출. ex) Math.random()
    메서드 반환타입 앞에 static 이 붙음.
    인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)와 관련없는 작업을 하는 메서드
    메서드 내에서 인스턴스 변수 사용 불가. 인스턴스로는 호출 불가. this 사용 불가
    클래스 변수 사용 가능.
  • 인스턴스 메서드
    : 인스턴스를 생성한 후, 참조변수.메서드이름()으로 호출
    인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)와 관련된 작업을 하는 메서드
    메서드 내에서 인스턴스 변수 사용 가능.

static 메소드는 인스턴스 변수와 인스턴스 메소드를 호출할 수 없지만,
인스턴스 메소드는 static 변수와 static 메소드를 호출할 수 있다.
(static메소드는 항상 호출가능해야하는데 객체가 있을지 없을지 모르기 때문에.)

오버로딩

: 한 클래스 안에 같은 이름의 메서드를 여러 개 정의 하는 것.
매개변수, 입력하는 값이 다르지만 같은 기능을 수행하는 경우가 많을 때 사용.

  • 조건
  1. 메서드 이름이 같아야 한다.
  2. 매개변수의 개수 또는 타입, 위치가 달라야 한다.
  3. 반환타입에는 영향을 받지 않는다. (반환타입이 다르다고 오버로딩이 성립하는건 아님)

생성자

: 인스턴스가 생성될 때마다 호출되는 인스턴스 초기화 메서드. iv를 초기화하는 메서드.
인스턴스 생성시 수행할 작업에 사용. 초기값이 필요한 인스턴스 변수의 값을 초기화해줌.

  • 생성 조건
  1. 생성자 이름이 클래스의 이름과 같아야 한다.
  2. return 값이 없지만 void는 붙이지 않는다.(항상 반환값이 없으니까)
  3. 오버로딩 가능하다.
  4. 모든 클래스는 반드시 생성자를 가져야한다.(없으면 컴파일러가 기본생성자 자동으로 추가)

기본 생성자

: 매개변수가 없는 생성자.
생성자가 하나도 선언되어있지 않을 때만, 컴파일러가 자동으로 추가.

클래스이름() {} // 기본생성자

this와 this()

  • this: 인스턴스 자신을 가리키는 참조변수.
    인스턴스 메서드(생성자 포함)에서 사용 가능.
    지역(매개)변수와 인스턴스 변수 구별할 때 사용.

  • this() 생성자에서 다른 생성자를 호출할 때 사용.
    다른 생성자 호출시 첫 줄에서만 사용 가능.


변수의 초기화

  • 초기화 : 변수를 선언하고 '최초로' 값을 할당하는 것.

  • 명시적 초기화 : 변수를 선언과 동시에 초기화하는 것. int a = 1;

  • 초기화 블럭 : 생성자 전에 중괄호{}블럭을 만들어 iv와 cv(블럭앞에 static) 초기화 가능.
    항상 생성자보다 먼저 실행. 생성자때문에 잘 쓰지는 않는다. 하지만 생성자가 여러개면 공통 수행코드를 iv 초기화 블록에 포함해 중복을 막을 수 있다.

  • 지역변수는 수동으로 초기화해야 한다.

    지역변수가 동작하는 스택메모리는 재사용이 빈번해 매번 초기화하면 성능이 떨어진다.
    그래서 그냥 해당 메모리에 있는 값으로 덮어 씌운다
    근데 해당 주소에 어떤 값이 있는지 모르기 때문에 java는 개발자에게 수동으로 초기화하라고 요구
    c언어에서는 이를 garbage value라 부른다.

  • 멤버변수의 초기화 (기본값으로 자동으로 초기화)
    클래스변수 : 클래스가 처음 로딩될 때 단 한번만 초기화
    인스턴스변수 : 인스턴스가 생성될 때마다 초기화

  • 초기화 순서(제일 마지막으로 초기화한 값만 남는다)
    클래스변수 : 기본값 -> 명시적초기화 -> 클래스 초기화 블럭
    인스턴스변수: 기본값 -> 명시적초기화 -> 인스턴스 초기화 블럭 -> 생성자

  • 초기화 방법 =

class Tv11_1 {
    boolean power = false;    // 기본형 변수의 초기화
    int channel = 1;          // 기본형 변수의 초기화
    Audio audi = new Audio(); // 참조형 변수의 초기화, 참조형은 객체주소 or null 로 초기화!!
    // 참조형의 기본값은 null 입니다!!
    ...
}
profile
Backend Dev / Data Engineer

0개의 댓글