일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 형변환 연산자
- java
- JSP
- 소수판정
- LANG
- 백준 알고리즘
- 알고리즘
- 자동 형변환
- 객체
- 연결된 예외
- 백준
- 재귀호출기본
- try&catch
- BufferedWrite
- OOP
- 디렉티브
- 객체지향
- HTML
- 암호론
- 공개키 암호
- jvm
- 현대암호
- lang package
- 자료구조
- 프로그래밍
- 예외처리
- 2884
- class
- bubble-sort
- 클래스 패스
- Today
- Total
코드일기장
[Java] 인스턴스 메서드와 static 메서드, 오버로딩 (객체지향 1-7) 본문
🎈 인스턴스 메서드와 static 메서드
서론으로는 인스턴스 메서드와 static 메서드에 대해 알아보자.
class MethodClass{
void loop() { //인스턴스 메서드
}
static float score(float f) { //static 메서드, 클래스 메서드
return f;
}
}
기본적으로 static이 붙어있으면 static메서드 혹은 클래스 메서드라고 부른다.
static이 없으면 인스턴스 메서드이다.
클래스 변수와 인스턴스 변수와 동일하다.
인스턴스 메서드
인스턴스 생성 후, '참조변수.메서드이름()'으로 호출한다.
메서드 내에서 인스턴스변수 사용 가능하다.
클래스 메서드
객체 생성 없이 '클래스이름.메서드이름()'으로 호출 가능하다.
메서드 내에서 인스턴스 변수 사용 불가능하다.
메서드 내에서 인스턴스 변수를 사용하지 않는다면 static을 붙이는 것을 고려한다.
결론적으로 인스턴스 변수 사용 가능하면 인스턴스 메서드이고, 인스턴스 변수 사용 불가능은 클래스 메서드이다.
public class Main {
public static void main(String[] args){
int r=MethodClass.score(600, 800);
System.out.print(r+"\n");
MethodClass m=new MethodClass();
m.a=350;
m.b=600;
System.out.println(m.loop());
}
}
class MethodClass{
int a,b; //인스턴스 변수
int loop() { //인스턴스 메서드
return a+b;
}
static int score(int a,int b) { //static 메서드, 클래스 메서드
return a+b; //여기서 a,b는 지역변수이다.
}
}
인스턴스 메서드와 클래스 메서드 사용 비교 코드이다.
main메서드를 보면 클래스 메서드 score는 객체 생성 없이 클래스 이름으로 호출 가능하다.
반면 인스턴스 메서드는 객체 생성 후 사용 가능하다.
인스턴스 메서드는 인스턴스 변수가 필요하다. 반면 static, 클래스 메서드는 인스턴스 변수가 필요 없다.
stratic 붙여야 할 때
속성(멤버 변수) 중에서 공통 속성에 static을 붙인다.
인스턴스 멤버(인스턴스 변수, 인스턴스 메서드)를 사용하지 않는 메서드에 static을 붙인다.
class TestClass{
int iv;
static int cv;
void iM() {
System.out.println(iv);
System.out.println(cv);
}
static void cM() {
System.out.println(iv); //error 클래스 메서드는 인스턴스 변수 사용 불가
System.out.println(cv);
}
}
인스턴스 메서드 iM()은 클래스변수 cv를 사용할 수 있다. 클래스 변수는 메모리에 이미 올라간 상태이므로 사용 가능
클래스 메서드 cM()은 클래스 변수만 사용할 수 있다. 인스턴스 변수 사용 시 에러
클래스 메서드는 인스턴스 변수, 메서드를 사용 못하는 이유는
객체가 생성이 안되어 있을 수 있으므로 사용을 못하는 것이다.
객체가 생성되어야 인스턴스 변수, 메서드를 사용 가능하기 때문
🎈 오버로딩 (overloading)
한 클래스 안에 같은 이름 메서드 여러 개 정의
예) println(); 같은 메서드는 프로그램에서 자주 사용하고 똑같은 클래스에 계속 사용한다. println()은 이름이 같다 이런 것이 오버로딩이다.
오버로딩 성립 조건
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입이 달라야 한다.
3. 반환 타입은 영향 없다.
class OverloadingTest{
int add(int a,int b) {return a+b;}
int add(int aa,int bb) {return aa+bb;}
}
위 코드는 오버로딩이 아니다. add메서드 이름은 같으나 매개변수의 개수와 타입 둘 다 일치 하므로 오버로딩이 아니다.
이 코드를 실행시키면 에러가 발생한다.
class OverloadingTest{
long add(int a,int b) {return a+b;}
int add(int aa,int bb) {return aa+bb;}
}
이 코드 또 한 오버로딩이 아니다. 오버로딩 성립 조건 3번째 반환 타입은 영향이 없다.
class OverloadingTest{
int add(int a,long b) {return a+(int)b;}
int add(int aa,int bb) {return aa+bb;}
}
이 코드는 오버로딩이다. 매개 변수 개수는 같으나 타입이 하나가 달라서 오버로딩이다.
class OverloadingTest{
int add(int a,int b) {
return a+b;
}
long add(int[] a) {
int result=0;
for(int i=0;i<a.length;i++) {
result+=a[i];
}
return result;
}
}
이런 식으로 add라는 메서드는 이름 그대로 비슷한 동작을 한다. 하지만 오버로딩으로 각자 다르게 존재하고 다르게 동작한다.
public class Main {
public static void main(String[] args){
OverloadingTest o=new OverloadingTest();
System.out.print(o.add(2, 2));
}
}
class OverloadingTest{
long add(int a,long b) {
return a+b;
}
long add(long a,int b) {
return a+b;
}
}
OverloadingTest 클래스에 add메서드 2개는 오버로딩이다. 하지만 에러가 발생한다.
The method add(int, long) is ambiguous for the type OverloadingTest 에러 구문
그 이유는, add(2,2)를 넣는다면 정확하게 어떤 add메서드에 넣는지 컴파일러가 알 수 없고 모호해진다.
2,2는 둘 다 자동형 변환으로 long으로 바뀔 수 있는데 누굴 자동형 변환시켜서 어떤 add메서드에 입력시키는지 모르기 때문이다.
이럴 땐
System.out.print(o.add(2L, 2));
리터럴을 사용하여 확실하게 컴파일러에게 알려줘야 한다.
🚀 다음 글 보기(객체지향 1-8)
🚀 이전 글 보기(객체지향 1-6)
'Java > OOP' 카테고리의 다른 글
[Java] 상속과 포함 (객체지향 2-1) (0) | 2022.01.20 |
---|---|
[Java] 생성자와 this(),this (객체지향 1-8) (0) | 2022.01.13 |
[Java] 호출 스택, 매개변수 (객체지향 1-6) (0) | 2022.01.04 |
[Java] 메서드와 return(객체지향 1-5) (0) | 2021.12.29 |
[Java] 변수의 종류와 클래스 변수 인스턴스 변수(객체지향 1-4) (0) | 2021.12.28 |