본문 바로가기
코딩

2022.02.14_6일차_메서드와 메서드 오버로딩

by 흥뷰자 2022. 2. 20.

지난 수업 내용에서 변수들의 구분에 대해 배웠는데요 다시 정리해보면

클래스 변수는 공통적으로 들어가는 특징을 담아둡니다. 쉽게, static이 붙은건 클래스변수다~하면 되죠. 프로그램이 실행되면 가장먼저 한공간에 한번만 실행됩니다. 객체생성할 필요 없습니다. 

인스턴스변수에는 달라지는 차이점을 담습니다. new키워드로 객체를 매번 생성하는데, 생성시마다 메모리를 따로 따로 점유하게 됩니다. new하기 전에는 사용이 불가합니다.

지역변수 메서드 내(=중괄호)에서 생성되고 중괄호가 닫기면 바로 소멸됩니다. static은 이 안에서 볼 수 없습니다. 

 
: 클래스= 속성(메서드 밖)   + 기능(메서드 안)



             <인스턴스변수(기본형)
<클래스변수(기본형)
              <인스턴스변수(참조형)
<클래스변수(참조형)


                                      <지역변수



: 클래스= 속성(메서드 밖)   + 기능(메서드 안)

                                      <매개변수가 지역변수

                                      :인스턴스생성
a변수를 출력하고 싶으면 인스턴스니까 객체를 생성하고 사용가능.
b변수는 객체생성 없이 바로 사용가능. (*위에서 TestA객체를 생성해 놓은 상태라 aaa.b로도 출력이 가능하지만, 가독성을 위해서 클래스명.b로 사용하는게 좋습니다.)

 

* 위에는 TestA클래스와 Test60클래스가 있습니다. 눈여겨볼만한 점은 TestA의 객체를 TestA클래스 내부가 아닌 Test60클래스 내부에서 생성하고 있다는 점입니다. 자신의 객체를 자신 내부에 생성하면 메모리 무한로딩에 빠지기 때문에 피해야합니다. (앞에 static을 붙여 메모리 한번만 로딩되게 한다면 가능은 합니다.)

 

 

06일차 학습내용

1. 메서드 method 
2. 인자 전달방식
3. 재귀호출 recursive call  

4. 메서드 오버로딩 (method overloading) 

 



1. 메서드 method 


: 어떠한 작업을 수행하기 위한 명령문들의 집합 .main(){} 도 메서드 .println() 

메서드를 사용하는 목적/ 장점은 : 재사용성입니다 : 반복적인 코드를 줄이고 코드 관리가 용이해지죠.
한 메서드 안에는 한가지 기능만 넣는 게 재사용성을 높입니다.


메서드 : 연산을 처리하는 곳
변수 : 그 결과를 저장하는 곳
메서드는 어떤 값을 입력받아 처리하기도 하고, 그 결과를 하나 돌려주기도 합니다.

메서드 유형은 (입력값 유무 x 리턴값 유무 : 따라 4가지 형태)로 나눌 수 있습니다.

 

메서드의 사용(호출)은 메인메서드에 작성해서 실행합니다. 물론, 메서드가 포함된 클래스가 객체가 생성된 후에, 사용가능합니다.

입력값 X, 리턴값 X
class Test{
        void finish(){

         }
}
Test test = new Test();
test. finish();
입력값 O, 리턴값 O
class Test{
         double average(int math, int eng, int kor){
                   return (math+eng+kor)3;
         }
}
Test test = new Test();
avg = test. average(90, 80, 100);


메서드 밖 변수에 static이 붙냐 안붙냐에 따라 클래스 변수와 인스턴스 변수를 구분했었죠.

메서드 앞에 static이 붙거나 안붙거나 할 수 있습니다. 붙은 건 클래스 메서드 안 붙은 건 인스턴스 메서드입니다. 메서드 안에 있는 변수인 지역변수는 static이 붙을 수 없다는 것과는 다른 말입니다. 

 

#1. 클래스 메서드 : static 붙은 메서드
객체 생성 안하고 바로 사용 가능 

ex) Math.random()
#2. 인스턴스 메서드 : 일반 메서드
객체 생성 후 사용가능
같은 클래스안에서 서로 호출하면, 객체 생성없이 바로 호출
-> 메로리 생성 시기가 같아서 가능.




4) main()메서드 : 메인은 satatic이 붙습니다. 즉 클래스 메서드가 됩니다. 객체 생성 없이, 프로그램 실행시 JVM에 의해 제일먼저 메모리에 먼저 올라가서 동작하게 됩니다.

메인메서드


public static void main(String[] args){
             // 코드 작성...
}

public : 접근지정자 : 전체 공개 : 다른 클래스에서 접근 가능
static : 클래스 메서드 선언 
void : 리턴타입 : 리턴해줄 것 없다~~
(String[] args) : 매개변수로 배열 타입을 받음. 매개변수 타입으로 내가만든 클래스 기본형 스트링 등 모두 다 됨. 문자열로 전달해서 숫자말고도 다 받을 수 있음. 
{} : 메인메서드 영역





2. 인자 전달방식(argument passing)


자바의 인자 전달 방식은 "값에 의한 호출 : Call-by-value"로, 호출하는 실제 인자의 값이 복사되어 메서드의 파라미터에게 전달됩니다. 이 말이 무슨말이냐...

1) 기본형값 전달 : read only : 값만 복사해줌. 원본 훼손x

2) 참조형값 전달 : read & write : 객체의 레퍼런스(주소값)이 전달.


plus 메서드에 인자로 넘겨준 num은 return으로 밖으로 돌려주지 않으면 메서드가 종료되는 } 시점에 사라지게 됩니다.
(#10)
또한 return받은 값을 다른 변수에 다시 담아놓지 않으면  결과는 사라지게 됩니다.
(#18)
참조형은 기본형과 달리 주소값이 저장되는 형태입니다.
int num = 12;
         인트형 변수에 - 12를 저장해!
String laugh = "hahaha";
         스트링 변수에 - hahaha객체의 주소값 저장해!
(주소값으로 저장? 한다고 call-by-reference인가 할수 있겠지만, laugh 자체의 주소값을 얻는 방법은 없음...)






3. 재귀호출 recursive call  

 

// 메서드 안에서 자기 메서드를 호출하는 것. stack메모리의 정확한 명칭 역시 call-stack
메서드 안에서 자기자신을 호출하는 것
반복문으로 바꿀 수 있으나, 연산처리 속도면에서는 재귀가 훨씬 빠르니까. 잘 쓰면 좋지요

재귀는 자기 자신으로 계속 반복하게 되니까, 종료 시점을 꼭 만들어줘야 합니다. (탈출조건 return) 안그러면 stack overflow에러 발생.

재귀호출

* 자기 자신으로 돌아가는 것이 아니라 함수는 실행할 때마다 새로운 메모리 영역이 확보가 되는 것이라 코드가 같은 걸 공유하더라도 내부 지역변수나 파라미터는 새로운것이여  == 스택!

4까지 곱하라고 하면 

3까지 곱한 함수를 호출

2까지 곱한 함수를 호출

1까지 곱한 함수를 호출

결과를 순차적으로 리턴해서 호출한 위치로 돌려주니까

1리턴

(1)*2 리턴

(1)*2)*3 리턴

(((1)*2)*3)*4 리턴 최종값

 

재귀호출은 알고리즘상 반복문보다 간결하고 직관적일 때가 있다 

>> 더 공부할 부분 재귀 호출의 활용

Composite pattern : 데이터 자체가 일차원이 아닌 다차원적 구조일 때 적용하는 방법
Back tracking : 게임에서 자주 사용
파서와 컴파일러

 



4. 메서드 오버로딩 (method overloading)  



한 클래스 내에, 이름이 같지만 매개변수의 타입이나 개수가 서로 다른 
여러개의 메서드를 중복 작성 가능한데, 
이를 메서드 오버로딩이라 합니다.
(주의! 매개변수의 이름이 다른것은 조건에 해당 안됨.
리턴타입 또한 조건에 해당 안됨)


// 메서드 오버로딩은 자바 컴파일러에 의해 판단되며, 
// 컴파일러가 이름이 같은 메서드들을 구분할 수 있으면 오버로딩 성공
// 컴파일러가 메서드 이름과 매개변수의 개수/타입 일치하는 메서드를 찾아냄.


* 메서드 오버라이딩 : 내용물 수정 덮어쓰기 하는 것.  상속이 되야지만 할 수 있음. 
오버로딩이랑 다른 것. 












 

댓글