본문 바로가기
JAVA

2022-10-11~12 객체지향언어 - 메소드 작성방법, 호출, 오버로딩, 캡슐화, 생성자 +활용

by HTT 2022. 10. 12.

객체지향언어

 


 

다양한 유형의 메소드 정의하기

 

1. 매개변수없고 리턴값이 없는 메소드
=> *을 10개 출력하는 기능을 갖고 있는 메소드
=> 외부에서 입력 받는 값이 없고 메소드 실행 결과값도 없다.
=> *을 10개 출력할 경우에만 사용할 수 있다.

public void display() { 
		for(int i=1; i<=10; i++) {
			System.out.print("*");
		}
		System.out.println();
	}
    
    
package oop.basic;   // MethodDemo에서 정의한 메소드를 호출해서 사용하기
public class MethodDemoTest {
	public static void main(String[] args) {
		MethodDemo m = new MethodDemo();
        m.display();
    }
}

 

2. 매개변수가 2개 있고 리턴값이 없는 메소드

public void display(String one, int two) {
	for(int i=1; i<=two; i++) {
		System.out.print(one);
	}
	System.out.println();
}


package oop.basic;  //MethodDemo에서 정의한 메소드를 호출해서 사용하기
public class MethodDemoTest {
	public static void main(String[] args) {
		MethodDemo m = new MethodDemo();
        m.display("★", 15);
    }
}

 

3. 매개변수가 있고 리턴값이 있는 메소드

=> 두 수를 입력받아서 더한 값을 리턴하는 메소드
=> 리턴값(메소드 실행결과)에 대한 타입을 메소드 선언부에 명시
=> 반드시!! 메소드의 마지막 문장에 return명령문을 이용해서 결과를 리턴시켜야 한다

public int add(int num1, int num2) {   //리턴값이 int이기 때문에 int add
	//return num1+num2; // 연산식이나 메소드 호출문을 직접 리턴값으로 사용가능
	//return값이 있는 메소드는 리턴타입과 동일한 타입의 변수를 선언(지역변수는 초기값이 있어야 한다)
	int result = 0;
	result = num1+num2;
	return result;    
	}
    
    
package oop.basic;   //MethodDemo에서 정의한 메소드를 호출해서 사용하기
public class MethodDemoTest {
	public static void main(String[] args) {
		MethodDemo m = new MethodDemo();
        m.add(100, 200);   // =>메소드호출
		//리턴값이 있는 메소드를 호출하는 경우 : 변수를 선언해서 저장할 수 있도록 처리하기
		int result = m.add(111, 222);
		System.out.println("리턴결과"+result);
        
        // 리턴값을 변수에 저장하면 다른 다양한 작업을 처리가능하다.
		if(result>=300) {
			System.out.println("pass");
		}else {
			System.out.println("fail");
		}
        
		//리턴값이 있는 메소드는 또 다른 메소드의 매개변수로 사용이 가능하다
		System.out.println("리턴결과"+m.add(300, 500));
    }
}

 

4. 응용(최솟값 구하기)

public int math(int num1, int num2) {
	int result = 0;
	return num1 > num2 ? num1 : num2;
}

MethodDemo m = new MethodDemo();
int sum = m.math(5, 7);   //둘 중 작은 값을 반환하는 메서드
System.out.println("num1, num2 중 큰 수 출력 : "+sum);

 

 

메소드 만들기

 

1. 100과 200을 더한 결과를 sysout으로 출력하는 메소드를 정의

package oop.basic;

public class MyMethod {

	public void printCalc() {
		System.out.println("결과:"+(100+200));
	}
}    
    
package oop.basic;
//MyMethod클래스에서 만든 메소드 호출해서 사용하기
public class MyMethodTest {

	public static void main(String[] args) {
		// 메소드 호출하기
		MyMethod m = new MyMethod();
		
		m.printCalc();
    }
}

 

2. 두 수를 입력받아 더한 결과를 sysout으로 출력하는 메소드 정의

package oop.basic;

public class MyMethod {
	public void printCalc(int num1, int num2) {
		int result = num1+num2;
		System.out.println(result);
	}
}


package oop.basic;
//MyMethod클래스에서 만든 메소드 호출해서 사용하기
public class MyMethodTest {

	public static void main(String[] args) {
		// 메소드 호출하기
		MyMethod m = new MyMethod();

		m.printCalc(222, 333);
	}
}

 

3. 구구단 응용

package oop.basic;

public class MyMethod { //1번
	public void printGuGu() {
		for(int row=2;row<=9;row++) {
			for(int i=1;i<=9;i++) {
				System.out.print(row+"*" +i +"="+(row*i)+"\t");	
			}
			System.out.println();
		}
	}
	
	public void printGuGu(int dan) { //2번
		for(int i=1;i<=9;i++) {
			System.out.println(dan+"*" +i +"="+(dan*i));	
		}
	}
	
	public int printGuGu(int opr, int num1, int num2) { //3번
		int result = 0;
		if(opr==1) {
			result = num1+num2;
		}else if(opr==2) {
			result = num1*num2;
		}else if(opr==3) {
			result = num1-num2;
		}else if(opr==4) {
			result = num1/num2;
		}
		return result;
	}
}
package oop.basic;

public class MyMethodTest {

	public static void main(String[] args) {
		MyMethod m = new MyMethod();
        
		m.printGuGu();
		
		m.printGuGu(8);
		
		int result = m.printGuGu(2, 30, 100);  //리턴값이 있기 때문에 변수 선언해서 받아주기
		System.out.println(result);
	}
}

 

 

 

 

오버로딩
public void printCalc(int num1, int num2) {
		int result = num1+num2;
		System.out.println(result);
	}
    
    
//printCalc메소드는 오버로딩된 메소드이다
	// 1번
public void printCalc(int num1, int num2, int num3) {
	int result = num1+num2;
	System.out.println(result);
	}
    
    //2번
public void printCalc(float num1, float num2) {
	float result = num1+num2;
	System.out.println(result);
	}
    
    //3번
public void printCalc(int data, int num2, int num3) {
	int result = num1+num2;
	System.out.println(result);  
    }
    
    //4번
public int printCalc(float num1, float num2) {
	float result = num1+num2;
	System.out.println(result);
	return 0; 
    }

1번. *매개변수 갯수*가 다르므로 오버로딩

2번. *매개변수 타입*이 다르므로 오버로딩

3번. 매개변수 갯수와 타입으로 오버로딩을 판단하기 때문에 *변수명*은 의미없다.

4번. 오버로딩은 매개변수에 대한 내용이므로 *리턴타입*이 달라진다고 오버로딩이 되지 않는다.

 

 

 

 

캡슐화, 참조변수 this

 

: 클래스를 정의할 때 멤버변수가 있는 경우 멤버변수를 private를 선언해서 정보를 숨겨놓고, public메소드를 통해서 접근    할 수 있도록 해야 한다.

ublic class Person2 { //외부에서 접근하지 못하도록!
	private String name;   //멤버변수
	private int age;
	private String addr;
	
	public void setName(String name) { //name변수(지역변수)
    	//setter메소드, 매개변수를 검증할 수 있는 값을 받아서 검증, 저장하고 말았으니 리턴타입x
	//매개변수인 name으로 전달된 값을 현재 작업 중인 Person2객체의 멤버변수인 name에 저장하겠다는 의미
		this.name = name;
	}
	
	//name변수에 저장된 값을 사용하기 위해서 name변수의 값을 호출한 곳으로 반환
	public String getName() {  //getter메소드. 만약 검증작업을 하는 경우에는 매개변수를 정의한다
		return name;  //= return  this.name;
	}
	

	public void setAge(int age) { //나이
		this.age = age;
	}
	public int getAge() {
		return age;
	}
	public void setAddr(String addr) { //주소
		this.addr = addr;
	}
	public String getAddr() {
		return this.addr;
	}
}
package oop.basic;

public class PersonTest3 {
	public static void main(String[] args) {
		Person2 obj = new Person2();
		//obj.name = "김하늘";
		//이름
		obj.setName("김하늘");
		System.out.println("성명 : "+obj.getName());
		//나이
		obj.setAge(18);
		System.out.println("나이 : "+obj.getAge());
		//주소
		obj.setAddr("경기도");
		System.out.println("주소 : "+obj.getAddr());
	}
}

- <name변수에 대한 작업>
- name변수에 값을 셋팅하는 메소드 - 외부에서 입력받은 값을 멤버변수인 name변수에 저장하기

- getter, setter 메소드 이용해서 값 입력하고 받아오기!!
- set : 내부에 값 전달해줌

- getName => name변수에 저장된 값을 사용하기 위해서 name변수의 값을 호출한 곳(main)으로 반환
- 메소드명 : set / get+멤버변수명(첫 글자는 대문자로 변경)

*  우클릭 - source - generate getter setter 클릭하면 자동 생성

 

 

 

 

생성자, this()

 

: 생성자는 객체가 생성될 때 딱 한 번!! 호출되는 메소드
▶  클래스타입 변수 = new 생성자메소드()
             --------------
                   ㄴ클래스 내부

-new연산자가 생성자 메소드를 보고 메모리에 할당할 클래스가 무엇인지 파악하고 생성자메소드를 호출해야 하므로
지켜야 하는 규칙이 존재한다.

 

▶  규칙

1) 생성자를 정의하지 않으면 컴파일러가 자동으로 매개변수가 없는 생성자를 추가한다.
   => 매개변수가 없는 생성자를 기본생성자라 한다.

2) 생성자메소드는 리턴타입을 명시하지 않는다.(void조차 명시하지 않음)

3) 생성자메소드명은 클래스명과 대소문자까지 동일하게 정의한다.

4) 생성자메소드에 매개변수를 추가할 수 있다.

5) 생성자메소드도 오버로딩이 가능하다.
    => 일반메소드처럼 매개변수 갯수나 타입을 다르게 해서 여러 개 정의하여 쓸 수 있다.

6) 생성자를 정의하면 컴파일러는 기본생성자를 정의하지 않는다.
    => 기본생성자는 자바 프레임워크에서 기본으로 호툴되는 경우가 많으므로 작업할 내용이 없어도 기본생성자는 항상 정의해야 한다.

7) 모드 생성자의 천 번째 문장은 super()가 생략되어 있다.

8) 생성자가 오버로딩이 되어 있으므로 생성자 안에서 자신의 생성자를 호출할 수 있다.

 


▶  문법


this(호출하고 싶은 생성자의 매개변수 스펙에 맞게 값을 전달)
=> 반드시 생성자를 호출하는 명령문은 생성자의 첫 번째 문장에 정의해야 한다.
=> this(.....)를 호출해서 사용하는 경우는 super(.....)를 같이 호출할 수 없다.

public Constructor() {    //리턴타입 입력x
		super();
		System.out.println("기본생성자");
	}

	public Constructor(String name) {
		super();
		System.out.println("매개변수 1개 생성자");
	}

 

-생성자의 오버로딩

// update용
	public Constructor(int age, String id, String pass, String telNum, String nickName) {
		super();
		this.age = age;
		this.id = id;
		this.pass = pass;
		this.telNum = telNum;
		this.nickName = nickName;
		System.out.println("매개변수 5개 생성자 호출");
	}

// serch용 생성자
	public Constructor(int age, String id, String pass, String telNum, String ssn, String nickName) {
		this(age, id, pass, telNum, nickName);   // 위에 있는 생성자를 호출함
		this.ssn = ssn;
		System.out.println("매개변수 6개 생성자 호출");
	}

// insert(입력), select(조회)용 생성자
	public Constructor(String name, int age, String id, String pass, String telNum, String ssn, String nickName) {
		this(age, id, pass, telNum, ssn, nickName);   // 위에 있는 생성자를 호출함
		this.name = name;
		System.out.println("매개변수 7개 생성자 호출");
	}

* this(.....), super(.....) 둘 중 하나만 적을 수 있음.

 

* 우클릭 - source - Generate Constructor using field로 자동생성 가능

 

 

 

[ 생성자와 메소드의 차이 ]

 

- 생성자 : 만들면서 초기화함

                객체가 만들어질 때 딱 한 번만 호출됨

                리턴타입x

- 메소드 : 반복되는 문장을 묶어놓은 것

                만들어놓고 계속 언제든 호출할 수 있음

                 리턴타입에 따라 다르게 작성(void, String, int....)

댓글