JAVA 객체지향 프로그래밍 기초 2

grapefruit·2022년 9월 6일
0

BE 2022-08.29~09.02

목록 보기
4/4
post-thumbnail

필드와 메서드 part

필드

‘클래스에 포함된 변수'를 의미'

자바에서의 변수는 크게
클래스 변수(cv, class variable),
인스턴스 변수(iv, instance variable),
지역 변수(lv, local variable)

세 가지로 구분

필드라 부른 것은 클래스 변수인스턴스 변수이며,
이 둘은 다시 static 키워드의 유무로 구분

1   class Example { // => 클래스 영역
2	   int instanceVariable; // 인스턴스 변수
3	   static int classVariable; // 클래스 변수(static 변수, 공유변수)
4
5	    void method() { // => 메서드 영역
6		    int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
7	     }
8    }

인스턴스 변수(iv)
인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new 생성자() 를 통해 인스턴스가 생성될 때 만들어진다.

static 키워드를 통해 선언하는 클래스 변수(cv)가 있다.
클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.

한 클래스로부터 생성되는 모든 인스턴스 들이 특정한 값을 공유해야하는 경우에
주로 static 키워드를 사용하여 클래스 변수를 선언하게 된다.
자동차로 예로 들면 자동차 휠 갯수, 타이어 갯수와 같이 모든 차량이 공유하는 특성을 저장하는 데에 사용된다.

또한, 클래스 변수는 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도

클래스명.클래스변수명 

을 통해 사용이 가능하다.

지역변수는 메서드 내에 선언되며 메서드 내( {} 블록 )에서만 사용가능한 변수이고,
멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 된다.

static은 클래스의 멤버(필드, 메서드, 이너 클래스)에 사용하는 키워드입니다.

static 키워드가 붙어있는 멤버를 우리는 ‘정적 멤버(static member)’라고 부르고
static이 붙어있지 않은 인스턴스 변수와 구분

static 키워드를 사용하면 모든 인스턴스에 공통적으로 적용되는 값을 공유할 수 있다.

메서드

“특정 작업을 수행하는 일련의 명령문들의 집합"을 의미

메서드는 다시 크게 머리에 해당하는 메서드 시그니처(method signature)와 몸통에 해당하는 메서드 바디(method body)로 구분

1     자바제어자 반환타입 메서드명(매개 변수) { // 메서드 시그니처
2	      메서드 내용 // 메서드 바디
3     }

메서드의 시그니처는 순서대로 해당 메서드가
어떤 타입을 반환하는 가(반환 타입),
메서드 이름이 무엇(메서드명)이며,
해당 작업을 수행하기 위해서 어떤 재료들이 필요한지(매개 변수)

에 대한 정보를 포함

1    public static int add(int x, int y) { // 메서드 시그니처
2	    int result = x + y; // 메서드 바디
3	    return result;
4    }

메서드명이 add 인 메서드이며 int 타입 2개의 값(x 와 y )을 받아 더한다음
int 타입의 결과값을 반환하는 메서드라 정리할 수 있다.

메서드의 반환타입이 void가 아닌 경우에는 메서드 바디( {} )안에 반드시 return 문이 존재해야 한다. 리턴문은 작업을 수행한 결과값을 호출한 메서드로 전달하고, 여기서 결과값은 반드시 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야 한다.

1    void printHello() { // 반환타입이 void인 메서드
2	     System.out.println("hello!");
3    }

이 예시의 printHello 메서드는 반환 타입이 void, 즉 반환 값이 없는 메서드를 의미합니다. 따라서 printHello 메서드는 호출되면 그저 hello! 라는 내용을 출력하고 종료된다.


1    int getNumSeven() { // 매개변수가 없는 메서드
2	    return 7;
3    }

getNumSeven 메서드는 int 타입의 결과값을 반환하는 매개변수가 없는 메서드입니다. 해당 메서드가 호출되면 그냥 숫자 7을 반환하면 되기 때문에 따로 매개변수가 필요하지 않다.

1    Double multiply(int x, double y) { // 매개변수가 있는 메서드
2	      double result = x * y;
3	       return result;
4    }

multiply 메서드는 매개변수 x와 y를 전달받아 반환 타입이 double인 result를 반환하는 매개변수가 있는 메서드이다. (int와 double형을 산술 연산하면 범위가 더 큰 타입으로 자동으로 형 변환이 이루어진다.)

메서드의 호출

메서드도 클래스의 멤버이므로 클래스 외부에서 메서드를 사용하기 위해서는 먼저 인스턴스를 생성해야합니다. 인스턴스를 생성한 후에 앞서 보았던 것처럼 포인트 연산자(.)를 통해 메서드를 호출할 수 있다.

반면, 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있다.

1     메서드이름(매개변수1, 매개변수2, ...); // 메서드 호출방법. 매개 변수가 없을 2수도 있음.
2
3    void printHello(); // 위의 코드 예제 호출
4    int getNumSeven();
5    Double multiply(4, 4.0);
6
7   //출력값
8    hello!
9    7
10   16.0

메서드 호출 시 괄호() 안에 넣어주는 입력 값을 우리는 ‘인자(argument)’라고 하는데, 인자의 개수와 순서는 반드시 메서드를 정의할 때 선언된 매개변수와 일치되어야 한다. 그렇지 않은 경우 실행 에러가 발생한다.
인자의 타입 또한 매개변수의 그것과 일치하거나 자동 형변환이 가능한 것이어야 한다.

메서드 오버로딩

하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미

오버로딩이 성립하기 위해서는 크게 두 가지 조건이 성립한다.

메서드를 오버로딩하려면

  1. 메서드의 이름이 같아야 한다.
  1. 매개변수의 개수 또는 타입이 달라야 한다.
profile
개발자몽

0개의 댓글