패스트캠퍼스 백엔드 부트캠프 3기

[패스트캠퍼스 백엔드 부트캠프 3기] 3주차 정리

다름임 2025. 1. 6. 11:33

메서드 : 특정 작업을 수행하는 문장의 묶음 

문장을 "작업 단위"로 묶고, 

"값(입력)"을 받아서 작업을 처리하고, 결과를 출력한다. 

함수의 특징을 가졌지만, 자바의 메서드는 클래스 영역 내에 선언되어 동작한다. 

 

메서드 작성 규칙 

1. 한 메서드는 한 기능만 하도록 작성한다. (최대한) 

2. 반복되는 여러 문장은 묶어서 한 메서드로 동작하게끔 한다. --> 중복 코드 제거 

3. 메서드의 이름은 기능을 잘 알 수 있도록 작성한다. 

 

메서드의 장점 

1. 코드의 재사용성 : 한번 작성한 메서드는 여러번 호출(사용) 할 수 있으며 , 다른 프로그램에서도 사용 가능하다. 

2. 중복코드 제거 : 반복되는 여러 문장을 묶어서 동작하게끔 한다.

프로그램은 수정해야 한다는 것을 기본 바탕으로 두고 작성해야 하는데, 메서드를 작성하면 수정할 코드의 대상이 적어져 오류 발생의 확률을 낮춘다.

3.  프로그램의 구조화/ 관리 용이 : 문장들을 작업단위로 나눠서 메서드로 작성하면 프로그램의 구조를 단순화 시킬 수 있다. 

 

메서드의 구조 

메서드 정의 =  메서드 선언 + 메서드 구현 

선언부와 구현부로 나누어져 있다. 

선언부 : 반환타입(작업 결과 출력), 메서드 이름, 매개변수 선언 ( 메서드 작업에 필요한 값들. 타입 생략 불가 ) 

매개변수는 지역변수의 일종으로, 메서드 호출 시 생성되어 메서드가 종료되면 같이 사라진다. 

구현부 : 메서드 호출시 수행될 문장을 묶은 것이다. 

return문은 반환할 값( 작업 결과) 를 출력하는 문장으로, return 키워드 다음에 올 값은 반환타입과 일치하거나 자동형변환이 가능한 것이어야 한다. 

 

지역변수: 메서드 내 선언된 변수들 

*** 메서드 내 지역변수는 메서드 안에서만 사용한다. 따라서 서로 다른 메서드는 같은 이름의 지역변수를 사용할 수 있다. 

---> 여기서 알 수 있는것 : 서로 다른 두 for문에서 매개변수로 같은 변수인 int 타입의 변수 i 를 사용하였는데도 에러가 안 나는 이유는, 지역변수이기 때문에 해당 변수가 위치한 for문 내에서만 동작하기 때문이다 !

<<i 는 매개변수이자, 지역변수>>>

 

지역변수는 --> 메서드 내 , 생성자 내, 초기화 블록 내, +++ 추가 : for문, if문, while문 등 반복문과 조건문도 그렇다. (단, while문 자체는 초기화 부분이 없으므로, 변수의 초기화를 블럭 외부에서 하기 때문에 반드시 지역변수라 할 순 없다. ) 

 

 

 

 

< 진짜 중요한 개념 !!!!!!!!!!!!>

메서드를 클래스 영역 안에 정의하고, main 메서드 안에서 메서드를 호출하여 메서드를 사용할 수 있다. 

이때 

메서드 정의에서 괄호() 안에 지정해준 값 --> 매개변수(parameter) 

메서드 호출에서 괄호() 안에 지정해준 값 --> 인자(argument)  라고 하는데, 

 

 

 

메서드를 호출하였을때 인자의 값이 메서드 정의 부분의 매개변수 값에 "복사"된다는 것을 기억해야 한다. 

int result = add ( 3, 5 );                  //메서드 호출

                              ↓  복사

       void  add(int a, int b){             //메서드 정의 

             return a+b;

       }

 

 

메서드를 호출한 자리의 인자 값은 메서드의 반환값이 대신한다. 


 

메서드는 클래스 영역에서 작성된다고 했는데, 같은 클래스라면 참조변수 없이 그냥 메서드이름만으로 사용할 수 있지만, 

다른 클래스라면 객체를 생성하여 참조변수를 통한 접근과 호출이 필요하다. 

메서드를 만들기 위해서는 간단하게 메서드에 해당하는 클래스를 만들고, 메서드를 작성하고 , 객체를 생성하고, 객체를 사용한다고 기억하면 쉽다. 

 

 

메서드의 매개변수에 들어오는 인자값은 타입이 맞거나, 자동 형변환만 가능하다면 무조건 들어올 수 있기 때문에 , 매개변수의 "유효성 검사"를 하는 코드가 필수로 작성되어야 한다. 

보통 return 문을 통해 조건을 검사하여 적절치 않으면 호출한 메서드로 돌아가는 방법이나, 매개변수 값을 보정하는 방식을 사용한다.

 

* 메서드는 JVM 에 의하여 메모리의 호출 스택 영역에 할당되는데, 메서드 호출 시 메서드의 작업에 필요한 메모리 공간만큼을 할당받는다. 메서드의 작업에 사용되는 지역변수, 매개변수, 연산의 중간 결과값 등도 같이 저장된다. 호출 스택을 보면 메서드 간의 호출관계와 현재 수행중인 메서드를 알 수 있다. 

 

* 메서드의 동작 

메서드는 항상 호출하는 쪽 (caller) 와 호출 당하는 쪽 (callee) 의 관계로 이루어져 있다. 

동작과정

1. 메서드(callee)가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다. 이때 호출한 쪽 메서드(caller)는 수행을 멈춘다.

2. 메서드(callee)가 수행을 마치고 나면 종료되면서 결과값을 자신을 호출한 메서드(caller)에게 반환한다. 

3. 메서드(callee)는 사용했던 메모리를 반환하고 스택에서 제외된다. 

4. 호출한 메서드(caller)가 다시 수행을 진행한다. 

 

- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드이며, 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드임을 알 수 있다. 

 

 


기본형 매개변수와 참조형 매개변수 이해하기

 

 

자바에서는 메서드를 호출할 때 매개변수로 지정한 값(=인자)을 메서드의 매개변수에 복사해서 넘겨준다고 했다. 

기본형 매개변수와 참조형 매개변수의 차이를 이해하기 위해서는 이 개념이 중요하다 .

 

매개변수의 타입이 기본형(primitive type) 일때는 기본형 값이 복사되고, 참조형 (reference type)이면 인스턴스의 주소가 복사된다. 참조변수가 복사되는데 참조변수는 곧 생성된 인스턴스의 주소를 의미하기 때문이다. 

 

* 기본형 매개변수 : 객체의 값만 복사, 변수의 값을 읽기만 가능, 변경 불가 

* 참조형 매개변수 : 인스턴스의 주소를 복사, 변수의 값을 읽고 , 변경 가능 

 

1. 기본형 매개변수

 

간단한 예제를 통해 이해해보자면 ,

 

코드 실행 결과

 

d.x값이 변하지 않았다.

호출문에서 인자로 d.x 사용 --> 해당 메서드의 매개변수에 a.x값 복사!

change(d.x);에서 넘겨주는 인자 ( 매개변수의 값)은 d.x 그 자체가 아닌 d.x의 값인 '10'이다.

d는 Data 타입으로 선언되어 생성된 인스턴스의 참조변수 이며, d.x는 참조변수를 통해 접근한 int 타입의 변수 x이므로 이것은 기본형 매개변수이다. 따라서 메서드 change의 매개변수 자리에 복사될 수 있다. 

 

여기서 변수의 값만을 가져왔기 때문에 이름이 같아 원본을 가져온 것 같지만 복사본일 뿐이며, change메서드 내에서 x의 값을 변경하여도 원본의 d.x 값은 변하지 않는다. 

 

x(지역변수)  !=  d.x(객체 내 인스턴스변수) 

 

여기서 메인 메서드의 d는 객체를 가리키고 있지만, change메서드는 변수 x에 d.x의 값을 가져오기만 했을뿐 객체를 가리키고 있지 않다. 

 

 

 

2. 참조형 매개변수 

똑같은 방법으로 예제를 통하여 설명해보자면, 

 

코드 실행 결과

d.x값이 변했다. 

호출문에서 인자로 d.x ( 변수의 값) 이 아닌 d(참조변수) 를 사용했기 때문에, 참조변수를 매개변수로 받는 메서드 change에서 참조변수의 값, 즉 인스턴스의 주소를 넘겨주었다. 

따라서 값을 읽고 변경할 수 있기 때문에 메서드 내부에서 d.x를 변경한 것이 호출 이후에 원본에도 적용되어 나타난다. 

 

그러면 여기에서 main 메서드의 d와 change 메서드의 d는 같은 객체를 가리키고 있는 것이다. 

 

 


참조형 반환타입 

(복습)  참조형이란?
참조형 == 참조형 변수를 의미한다. 
변수는 단 하나의 값을 저장하는 메모리 공간이다. 
그렇다면 참조형 변수는 단하나의 값=  '객체의 주소'를 값으로 가지는 변수이다. 
(cf. 기본형 변수는 실제 값(data)를 저장한다.)

 

메서드의 반환 타입으로 참조형을 사용할 수 있다. 

참조형은 객체의 주소이기때문에, 실제 반환되는 값은 정수값이다. 

따라서 참조형이 반환타입이라는 것은, 메서드가 참조변수의 값, 즉 "객체의 주소"를 반환한다는 것이다. 

 

 

객체의 생성이 메서드 내에서 이루어지는 이유 

객체는 왜 클래스 내부에서 생성할 수 없고 메서드 내에서만 생성할 수 있을까?

--> 객체의 생성 시점과 메모리 할당 방식의 차이 때문

 

 

객체는 데이터를 다루고 저장하기 위한 실체이다. 데이터를 다루기 위해서는 메모리 공간(힙 영역) 이 필요한데, 이는 메서드의 실행으로 적절한 메모리가 할당되어야 함을 전제조건으로 한다. 따라서 객체는 메서드 내에서 생성이 이루어져야 한다. 

((메서드는 프로그램 실행중에 호출되어 메모리를 할당할 수 있는 실행 단위이므로 ))

클래스는 단순히 객체 생성을 위한 설계도이기 때문에, 클래스가 로드되었다고 해서 바로 메모리를 할당하지 않는다. 

클래스 내부에서도 static 멤버나 static 초기화 블록을 사용하여 객체를 생성할 수 있다. 

그러나, 정적멤버나 초기화 블록으로 생성된 객체는 정적 멤버를 사용하는 시점에만 유효하다. 즉, 메서드 내에서 객체가 생성되지 않거나 호출되지 않으면 아무 의미가 없다. 

static 멤버는 클래스 로드시 메서드 영역에 클래스 정보와 함께 생성되지만, 실제로 사용하려면 메서드(main)에서 접근해야 의미가 있다. 초기화 블록도 마찬가지이다. 

 

메서드에서 객체를 생성하지 않으면 무의미한 이유

: 해당 객체를 사용할 메서드가 없다면 프로그램에서 그 객체는 의미가 없어진다. 

객체는 데이터를 저장하고 처리하기 위해 존재하므로, 이를 다루는 코드인 메서드가 없으면 객체의 생성 자체가 목적을 잃는다. 

 

 

  1. 객체는 메모리가 할당되어야 동작하므로, 실행 가능한 코드(주로 메서드) 내에서 생성됩니다.
  2. 정적 멤버나 초기화 블록은 클래스 로드 시 객체를 생성할 수 있지만, 이를 사용하려면 반드시 메서드에서 접근해야 의미가 있습니다.
  3. 객체가 생성되더라도, 그 객체를 활용할 메서드가 없으면 프로그램에서 실제로는 무의미한 코드가 됩니다.

 

 

궁금했던 점 

궁금증 

1. 만약에 static 변수가 클래스에 정의되어 있지 않은데, static 메서드가 정의되어 있으면 

static 메서드는 어떤 값을 가지고 작업할 수 있을까 ? --> main 메서드에서 넘겨주는 매개변수(지역변수 사용.)

 

2.만약에 인스턴스변수가 없으면, 인스턴스 메서드는 무엇으로 작업할 수 있을까?

- 인스턴스 메서드는 클래스의 멤버변수(static 변수, 인스턴스변수) , 매개변수, 지역변수로 다 호출하여 동작할 수 있다. 단, 객체 생성후 가능 

 

그래서 예제를 작성해보았다. 

 

 

그런데 막상 해보니.. 인스턴스 변수가 없으니까 메서드도 잘 동작하고 결과값도 잘 나오지만 

메서드가 종료되면 그냥 값들이 날아가버린다. . 무의미한 행동 

 

그래서 클래스에 인스턴스 변수를 정의하는 것이군.. 아니면 static 변수라도. 

 

 

클래스 멤버와 인스턴스 멤버의 관계

 

 

 

클래스 영역 {

  인스턴스 변수;

  클래스 변수;

  

  인스턴스 메서드(){

           인스턴스 변수, 클래스 변수, 인스턴스 메서드, 클래스 메서드 사용 가능  }  

  클래스 메서드(){ 

            클래스 변수, 클래스 메서드 사용 가능  }

}

 

클래스영역2{

 메인 메서드(){

     인스턴스 객체 생성; ---> 이후로 인스턴스 멤버가 생성된다. 

}

 


클래스 멤버 : 클래스 변수, 클래스 메서드 

인스턴스 멤버 : 인스턴스 변수, 인스턴스 메서드

 

 

클래스 멤버와 인스턴스 멤버간의 참조와 호출 

인스턴스 멤버 ←→ 인스턴스 멤버 (O)
인스턴스 멤버   →   클래스 멤버 (O)
클래스 멤버      →    클래스 멤버 (O)
클래스 멤버      →    인스턴스 멤버 (X)

클래스 멤버는 클래스가 로딩되면 생성된다. 

인스턴스 멤버는 인스턴스 생성 후에 Heap 영역에 생성된다. 

클래스 멤버는 인스턴스 멤버를 참조하거나 호출할 수 없다.

클래스 멤버는 존재하지만 인스턴스가 생성되지 않아 인스턴스 멤버가 존재하지 않을 수도 있기 때문이다. 

 

따라서 객체를 생성한 후, 참조하거나 호출해야 한다. 

 

 

인스턴스 멤버가 인스턴스 멤버를 참조/ 호출 할 수 있는 이유?

--> 인스턴스 멤버가 누군가를 호출, 참조했다는 것은 이미 인스턴스가 생성되어 있음을 의미하기 때문이다 

 

 

 

 

 

참고 1: 참조변수를 선언하지 않고 객체를 생성해서 사용하는 방법 

- 참조변수 자리에 객체 생성문을 대입한다. 


Membercall c =  new Membercall();
int result = c.intstanceMethod1(); 에서 


Membercall c = new Membercall(); 을 두줄로 나누면 (선언, 대입) 
선언 : Membercall c;
대입 : c = new Membercall(); 

int result 에 대입하는 c에 new Membercall(); 을 넣으면 
int result = new Membercall().instanceMethod(); 이라고 작성할 수 있다. 

대신, 참조변수를 작성하지 않았기 때문에 생성된 Membercall 인스턴스는 더이상 사용할 수 없다. (접근 수단 없음) 

 

java

java

만약에 클래스에 멤버변수가 없으면 메서드는 어떤 값으로 작업할까?

만약에 클래스에 멤버변수가 없으면 메서드는 어떤 값으로 작업할까?