객체지향언어
다양한 유형의 메소드 정의하기
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....)
'JAVA' 카테고리의 다른 글
2022-10-14 객체지향언어 - 생성자, 상속 (0) | 2022.10.17 |
---|---|
2022-10-13 객체지향언어 - 배열, 클래스 메소드(static메소드)와 인스턴스 메소드 (0) | 2022.10.13 |
2022-10-07 if, for, while,/do~while, break/continue, Frame, 객체지향언어, 지역변수/전역변수 (0) | 2022.10.08 |
2022-10-06 java API, 리터럴, 데이터타입 (0) | 2022.10.08 |
2022-10-05 java 컴파일, basic (0) | 2022.10.05 |
댓글