OOP에서 객체의 action(기능)을 정의하는 부분을 operation이라고 하는데 이 operation을 java에서는 method라고 한다.
메서드 이름 명명 규칙
- 동사이면서 소문자로 시작한다.
- 메서드 이름이 두 단어 이상인 경우 첫번째 단어를 제외하고 각 단어의 첫글자는 대문자여야 한다.
- 예) sum(), areaOfCircle()
Access method (접근자 메서드) → getter
public int getNumber(){
return number;
}
Mutator method (설정 메서드) → setter
public void setNumber(int number){
this.number = number;
}
public class StaticMethod{
public static void main(String[] args){
show();
}
static void show(){
System.out.println("Static method 예제");
}
}
public class InstanceStaticMethod{
//Object(instance) method
void instanceMethod1(){}
//static method
static void staticMethod1(){}
//instance method
void instanceMethod2(){
instanceMethod1(); //다른 instance method 호출
staticMethod1(); //static method 호출
}
//static method
static void staticMethod2(){
//instanceMethod1(); //Error! 인스턴스를 호출할 수 없다
InstanceStaticMethod instance = new InstanceStaticMethod();
instance.instanceMethod1(); //성공
staticMethod1();
}
}
public static void main(String[] args){
MyDate date;
int var;
val = 11;
//기본형 변수의 값을 변경하기 위해 호출
changeInt(val);
System.out.println("Int value: " + val);
date = new MyDate(2022, 7, 22);
//참조 변수의 참조값을 변경하기 위해 메서드 호출
chageObjectRef(date);
//현재 멤버 변수의 값 출력 -> 원래 객체를 참조하고 있다.
date.print();
//참조변수의 setter 메서드로 객체의 멤버변수 값 수정
chageObjectVar(date);
//값이 변경된 걸 확인
date.print();
}
public static void changeInt(int value){
value = 55;
}
public static void changeObjectRef(MyDate ref){
ref = new MyDate(2022,1,1);
}
public static void changeObjectVar(MyDate ref){
ref.setDay(4);
}
public class PassByValueEx1{
public static void main(String[] args){
int foo = 1;
System.out.println(foo); //1
//Pass by Value
setFoo(foo);
System.out.println(foo); //1
}
public static void setFoo(int bar){ //bar = 1
bar = 2;
}
}
public class Mug{
private String contents;
public Mug(String contents){
this.contents = contents;
}
public void setContents(String contents){
this.contents = contents;
}
public String getContents(){
return contents;
}
}
public class PassbyReferenceEx1{
public static void main(String[] args){
//Mug 클래스의 생성자를 호출하면서 contents 멤버변수에 초기화 값 "Tea"를 할당
Mug myMug = new Mug("Tea");
System.out.println(myMug.getContents());
//myMug 객체 참조 변수의 참조값을 전달
spill(myMug);
//spill 메서드 종류 후의 myMug 인스턴스의 contents 값이 "Nothing"으로 변경됨
System.out.println(myMug.getContents());
}
public static void spill(Mug mugToBeSpilled){
//myMug와 mugToBeSpilled는 동일한 Mug 인스턴스를 참조한다
//Mug 인스턴스의 setContents메서드로 값을 변경
mugToBeSpilled.setContents("Nothing");
}
}
하나의 클래스 내에 동일한 이름으로 동일한 작업을 하는 여러 개의 메서드를 구현하는 것
하나의 작업만 수행해야 하는 경우 메서드의 이름이 동일하면 프로그램의 가독성이 높아지고, 기능은 동일하나 매개변수 목록이나 타입에 따라 호출되는 메서드를 제어하고자 할 경우 사용된다.
오버로딩 조건
- 메서드 이름이 동일해야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
- return type, modifier는 오버로딩 조건에 영향을 미치지 않는다.
- 매개변수는 같고 리턴타입이 다른 경우는 오버로딩 조건이 되지 않는다.
public class MethodOverloading{
public static void main(String[] args){
ClacAdder adder = new CalcAdder();
//메서드 오버로딩 조건 성립 - 매개변수 개수가 다르다
adder.add(10,20);
adder.add(10,20,30);
//메서드 오버로딩 조건 성립 - 매개변수 데이터 타입이 다르다
adder.add(12,5D,21,7D);
}
}
class CalcAdder{
int add(int a,int b){
return a+b;
}
double add(double a,double b){
return a+b;
}
int add(int a,int b,int c){
return a+b+c;
}
}
생성자는 클래스의 인스턴스 생성에 사용되며, 객체가 생성될 때 멤버변수들의 값을 초기화하는 기능을 한다.
public class ConstructorOverloading{
int id;
String name;
//오버로딩 생성자로 매개변수가 있음
ConstructorOverloading(int id, String name){
//인스턴스 초기화 작업
}
}
public class ConstructorOverloadingTest{
public static void main(String[] args){
//기본 생성자가 없기 때문에 오류가 발생한다
ConstructorOverloading c1 = new ConstructorOverloading();
ConstructorOverloading c2 = new ConstructorOverloading(1, "test");
}
}public class ConstructorOverloading{
int id;
String name;
//기본 생성자로 매개변수 없음
ConstructorOverloading(){
//인스턴스 초기화 작업
}
//오버로딩 생성자로 매개변수가 있음
ConstructorOverloading(int id, String name){
//인스턴스 초기화 작업
}
}Java에서 자사 생성자는 없지만 한 객체에서 다른 객체로 값을 복사하는 방식으로 처리할 수 있다.
public class CopyConstructorEx1{
int id;
String name;
CopyConstructorEx1(int i,String n){
id = i;
name = n;
}
//constructor to initialize another obejct
CopyConstructorEx1(CopyConstructorEx1 originObj){
id = originObj.id;
name = originObj.name;
}
void display(){
System.out.println(id+" "+name);
}
public static void main(String[] args){
CopyConstructorEx1 obj = new CopyConstructorEx1(123,"홍길동");
CopyConstructorEx1 copyObj = new CopyConstructorEx1(obj);
obj.display();
copyObj.display();
}
}
생성자와 메서드의 주요 차이점은 return type이 없고, 사용 용도가 다르며, 호출 시점이 다르다는 것이다.
| 생성자 | 메서드 |
|---|---|
| 객체의 상태를 초기화하는 사용(초기화시 1번만 호출) | 객체의 동작을 노출하는데 사용(필요시 제한없이 호출) |
| return type이 없어야 한다 | return type이 있어야 한다 |
| 암묵적으로 호출된다 | 명시적으로 호출된다 |
| Java 컴파일러는 클래스에 생성자가 없는 경우 기본 생성자를 제공한다 | 어떤 경우에도 컴파일러가 제공하지 않는다 |
| 생성자 이름은 클래스 이름과 동일해야 한다 | 메서드 이름은 클래스 이름과 같을 수도 아닐 수도 있다 |