11일차 메소드
메소드
메소드란?
(1)객체의 동작(기능)
(2)호출해서 실행할 수 있는 중괄호 { } 블록
(3)메소드 호출하면 중괄호 { } 블록에 있는 모든 코드들이 일괄 실행
메소드 선언
(1)리턴타입 메소드이름(매개변수) {메소드 실행블록에 들어갈 코드}
--------------------------------전자계산기 메소드/ 선언 --------------------------
package methodex;
import lombok.NoArgsConstructor;
//현실세계의 "전자계산기" 객체를 모델링하여,
//그 기능(행위)를 도출하고, 도출된 기능(행위)를 메소드로 선언하자!!!
@NoArgsConstructor //하고서 임포트해줘야함 // 아우터라인 뷰에서 생성자확인
public class CalculatorEx00 {
//개발자가 명시적으로 하나라도 기본생성자를 선언 하지 않으면,
// 나중에 어떤 무슨 오류가 생길지 모른다.
// CalculatorEx00(){} << 롬복에 위 에너테이션이 기본생성자까지 생성해주기에 중복
void PowerOn() {
System.out.println("전원을 켠다");
}// powerOn
int plus(int x, int y) {
int result = x + y;
return result;
} // plus
double divide(int x, int y) {
double result =(double)x / (double)y;
return result;
} // divide
void powerOff() {
System.out.println("전원을 끈다");
}// powerOff()
}//end class
-----------------------------------------전자계산기 메소드 사용 ----------------------------
package methodex;
public class CalculatorEx01 {
// 메소드 시그니처에 대해서 파악해서 구분할 줄 알아야 한다!!
// 메서드 이름과 매개변수 리스트의 조합
// 기브와 테이크를 아는 것.
public static void main(String[] args) {
//1. 전자계산기 인스턴스 생성
CalculatorEx00 myCalc = new CalculatorEx00();
//2. 전자계산기의 메소드 호출
myCalc.PowerOn(); //전원 on
//3. 2번과 동일
int result = myCalc.plus(5,6); // 덧셈연산 수행하고 결과받음
System.out.println("result = "+result);
//4. 2번과 동일
byte x = 10;
byte y = 4;
double result1 = myCalc.divide(x, y); //나눗셈 연산 수행하고, 결과 받음
System.out.println("result1 = "+result1);
//5. 2번과 동일
myCalc.powerOff();
}// main
}// end class
객체와 객체간에 상호작용을 하게 해주는 것은 메소드이다
메소드 리턴 타입
(1)메소드 실행된 후 리턴하는 값의 타입
(2)메소드는 리턴값이 있을 수도 있고 없을 수도 있음
메소드 이름
(1)자바 식별자 규칙에 맞게 작성
- 무엇을 만들든 이름이 뭘 의미 하는지 의미있게 지어라
- 길이는 제한이 없다.
메소드 매개변수 선언
(1)매개변수는 메소드를 실행할 때 필요한 데이터를 외부에서 받기 위해 사용
(2)매개변수도 필요 없을 수 있음
리턴(return) 문
(1)메소드 실행을 중지하고 리턴값 지정하는 역할
(2)리턴값이 있는 메소드
-반드시 리턴(return)문 사용해 리턴값 지정해야
-return 문 뒤에 실행문 올 수 없음
(3)리턴값이 없는 메소드
-메소드 실행을 강제 종료 시키는 역할
----------------------------------컴퓨터 메소드 / 리턴 타입 ---------------------------
package methodex;
import lombok.NoArgsConstructor;
// 롬복은 클래스 선언시에만 사용 합니다 .
//다른참조 타입 을 만들때 사용하는 것 아님 .
@NoArgsConstructor
public class ComputerEx {
String model;
int price;
int sum1(int[] values) {
System.out.println("Computer::sum1(values) invoked");
int sum = 0;
for(int i=0; i<values.length; i++) {
sum += values[i];
}//for
//1. return 키워드를 만나는 그 즉시, 메소드의 실행 종료
//2. return 키워드 다음에 값이 나오면, 이 값을 호출자에게 반환:
// (1) literal
// (2) 변수
// (3) 표현식 =>
// (4) 리턴타입에 일치하는 값을 반환하는 다른 메소드 호출
// 어느 영역에서 호출되었는지 this로 구분해준다.
String model = "MODEL_1";
System.out.println(this.price);
System.out.println(this.model);
System.out.println(model);
return sum;
}//sum1
// int sum2(int ... values,String name) 이건 오류
int sum2(String name,int ... values) { // 앞에만 다른 타입의 매개변수 넣을 수 있음
// int sum2(int ... values) { //가변인자 = 배열 / 1개를 주던 1000개를 주던 배열
System.out.println("Computer::sum2(values) invoked");
int sum = 0;
for(int i=0; i<values.length; i++) {
sum += values[i];
}//for
method1();// 얼마든지 다른 메소드를 사용할 수 있다.
return sum;
}//sum2
void method1() {
System.out.println("Computer::method1 invoked");
method2(); // 다른 메소드를 사용하는 메소드
}
void method2() {
System.out.println("Computer::method2 invoked");
}
}//end class
----------------------------------컴퓨터 메소드 / 리턴 타입사용/ 배열매개변수 ---------------------------
package methodex;
public class ComputerEx01 {
public static void main(String ... args) { // 이것도 되구만
ComputerEx myCom = new ComputerEx();
int[] values1 = {1, 2, 3};
int result1 = myCom.sum1(values1);
System.out.println("result1: " + result1);
int result2 = myCom.sum1(new int[] {1, 2, 3, 4, 5});
System.out.println("result2: " + result2);
// 가변인자를 매개변수로 가지는 메소드를 호출 할 때,
// 인자를 전달하는 방법
int result3 = myCom.sum2("계산한다!",1, 2, 3);
System.out.println("result3: " + result3);
// int result4 = myCom.sum2(1, 2, 3, 4, 5);
// System.out.println("result4: " + result4);
} //main
}//class end
메소드 호출
(1)메소드는 클래스 내∙외부의 호출에 의해 실행
-클래스 내부: 메소드 이름으로 호출
-클래스 외부: 객체 생성 후, 참조 변수를 이용해 호출
----------------------------------계산기 메서드 생성----------------------------------
package methodex02;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class Calculator {
//1. 필드
//2. 생성자
//3. 메소드
int plus(int x, int y) {
int result = x + y;
return result;
} // plus
double avg(int x, int y) {
double sum = plus(x, y);
double result = sum / 2;
return result;
}//avg
void execute() {
double result = avg(7, 10);
println("실행결과" + result);
}// execute
void println(String message) {
System.out.println(message);
} //println
} //end class
--------------------------------계산기 객체 생성 외부 메서드 호출---------------------------------------
package methodex02;
public class CalculatorExample {
public static void main(String[] args) {
Calculator myCalc= new Calculator();
myCalc.execute();
}
}
메소드 오버로딩(Overloading)
(1)클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것
(2)하나의 메소드 이름으로 다양한 매개값 받기 위해 메소드 오버로딩
(3)오버로딩의 조건: 매개변수의 타입, 개수, 순서가 달라야
-------------------------------------메서드 오버로딩 ------------------------------
package methodex03;
import lombok.NoArgsConstructor;
@NoArgsConstructor
public class Calculator {
//1. 필드
//2. 생성자
//3. 메소드
// 정사각형의 넓이
double areaRectangle(double width) {
return width * width;
}// areaRectangle
// 직사각형의 넓이
double areaRectangle(double width,double height) {
return width * height;
}// areaRectangle
} //end class
-----------------------------------오버로딩 사용---------------------------
package methodex03;
public class CalculatorExample {
public static void main(String[] args) {
Calculator myCalc= new Calculator();
//정사각형의 넓이 구하기
double result1 = myCalc.areaRectangle(10);
//직사각형의 넓이 구하기
double result2 = myCalc.areaRectangle(10,20);
//결과 출력
System.out.println("정사각형 넓이 =" + result1);
System.out.println("정사각형 넓이 =" + result2);
} //main
}// end class
*자바클래스 중에 , 아래의 조건을 지키는 클래스,
특별히 '자바빈즈 ' 클래스라고 함
*일반적인 클래스가, 아래의 규칙을 지켜서, '자바빈즈' 클래스가 되면,
'프로퍼티'라고 하는 새로운 성질/개념이 생긴다.
(1) '프로퍼티'는 필드가 아니다. 이름일 뿐이다.
(2) '프로퍼티'는 gettet 또는 setter - 접두사(get/set)
getName => Name => name
setName => Name => name < 이것이 프로퍼티이다.
만약, 아래와 같이 필드에 대해서, Getter/Setter 이름을 다르게 지은다면 이때는 절대 프로퍼티 이름과 필드이름이 같을 수가 없다.
String getMyName() { ==> Myname ==>myName (프로퍼티이름)
return this.name;
}// getName
void setMyName(String name) { ==> Myname ==>myName (프로퍼티이름)
this.name = name;
}// setName
프로퍼티가 중요한이유는! 기업업무로 웹서비스를 만들때
자바빈즈 클래스로 비지니스 데이터를 저장하는 객체를 만들기 때문이다.
-JSP/Servlet, Spring, J2EE, EJB, ..... 에 사용
-프로퍼티를 통해, 필드의 값을 조작 (읽기/쓰기)
-가장 중요한 것은 비지니스 업무 데이터를 보호한다.
다음은 자바빈즈(JavaBeans) 클래스 규약이다.
1) private 접근제한자로 필드를 선언한다. (필수)
2)각 필드에 대해, getter 메소드와 setter 메소드를 갖는다. (필수)
3) 기본 생성자가 반드시 존재해야 된다. (필수)
4) implements Serializable (선택)
*Getter 메소드
가. 각 필드의 값을 반환해주는 메소드(기능)
나. 매개변수를 가지지 않음 (왜? 필드의 값을 반환하는 기능이기 때문에)
다. 메소드의 이름을 지을때, 아래와 같은 규치으로 짓습니다.
'get'(prefix) + <필드명> => 필드타입 get필드명(){.....}
예: private String name = "Yoseph";
'get' + name ==>
// name 필드에 대한 Getter 메소드 선언
String getName() {
return this.name;
}// getName
*Setter 메소드
가. 각 필드에 새로운 값으로 변경해주는 메소드(기능)
나. 매개변수를 가져야함 (왜? 필드에 넣어줄 새로운 값이 필요하니까)
다. 메소드의 이름을 지을때, 아래와 같은 규치으로 짓습니다.
'set'(prefix) + <필드명> => void set필드명(필드타입 매개변수명){.....}
예: private String name = "Yoseph";
'set' + name ==>
// name 필드에 대한 Setter 메소드 선언
void setName(String name) {
this.name = name;
}// setName
---------------------------------lombok사용 및 getter setter--------------------------------
package methodex;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
// lombok에 annotation(추가적인 설명글)
@Setter //롬복으로 Getter Setter만들기 아우터라인 뷰에서 보임 숨겨져있음
@Getter // 필드 옆에 붙이면 필드하나에 대해서만 할 수도 있음
@NoArgsConstructor
public class Car { // 자바빈즈 클래스
//1.필드
private int gas;
private String model;
private int year;
//2. 생성자 = lombok 이용 @NoArgsConstructor
// 3. Getter/Setter 메소드
// (1) Getter: 필드의 값을 반환해주는 메소드
// 'get' + 필드명() {}
// public int getGas() { // 'gas' 이름의 프로퍼티 생성
// return this.gas ;
// } // getGas
// (2) Setter : 필드의 값을 변경해주는 메소드
// 'set' + 필드명(){}
// public void setGas(int gas) { // 'gas' 이름의 프로퍼티 생성
// this.gas = gas;
// }//setGas
// 이클립스로 자동으로 만들 수있음 소스탭 >> Generate Getter and Setter
// public int getGas() {
// return gas;
// }
//
//
// public void setGas(int gas) {
// this.gas = gas;
// }
// 4.모델링 대상 객체의 기능을 메소드로 구현
boolean isLeftGas() { // 영어권에서는 Gas가 휘발유
if(gas==0) {
System.out.println("gas가 없습니다.");
return false;
}
System.out.println("gas가 남았습니다.");
return true;
} // isLeftGas
-------------------------------위의 클래스의 객체 사용---------------------------------
package methodex;
public class CarExample {
public static void main(String[] args) {
Car myCar = new Car();
myCar.setGas(5); //Car의 setGas() ¸메소드 호출
boolean gasState = myCar.isLeftGas(); //Car의 isLeftGas() ¸메소드 호출
if(gasState) {
System.out.println("출발합니다.");
myCar.run(); //Car의 run() ¸메소드 호출
} //if
if(myCar.isLeftGas()) { //Car의 isLeftGas() ¸메소드 호출
System.out.println("gas를 주입하지 않아도 됩니다.");
} else {
System.out.println("gas를 채워주세요");
}// if-else
}// main
}//end class
인스턴스 멤버
인스턴스 멤버란?
(1)객체(인스턴스) 마다 가지고 있는 필드와 메소드
-이들을 각각 인스턴스 필드, 인스턴스 메소드라고 부름
(2)인스턴스 멤버는 객체 소속된 멤버이기 때문에 객체가 없이 사용불가
--------------------------------lombok을 통한 생성자 / 래퍼클래스--------------------------------
package instanceex;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor //모든 필드를 초기화시키는 생성자를 만들어줌
@RequiredArgsConstructor// 01과 같은 효과 특정필드에 초기화해주는 생성자를 생성할 때 사용
public class Person {
//---------------------------------------------------------------------------------------------
// 자바언어에서는, 기본타입마다 각 타입에 대응하는 참조타입을 가지고 있습니다.
//여러가지 이유로 기본타입보다 참조타입이 많이 사용되기 때문입니다.
// 기본타입| 참조타입(wrapper Type)
// byte | Byte
// char | Char
// short | Short
// int | Integer
// long | Long
// ----------------------
// float | Float
// double | Double
// ----------------------
// boolean | Boolean
// ----------------------
// void | Void
//---------------------------------------------------------------------------------------------
@NonNull // 값이 null이 아니어야 한다./ 자체만으로 에너테이션을 만들지는 않는다.
String name; //null
@NonNull Integer age; // 0
Boolean gender; // null --> "결측치" (Missing Value)는 기본값으로 설명을 못함.
Double height; // null
Double weight; // null
// 임의의 주석명: 01
// Person(String name,int age){
// this(name,age,false,.0 ,.0);//숫자앞에 유효숫자 0이면 0가능
// } // constructor
Person(String name,int age,boolean gender){
this(name,age,gender,.0 ,.0);
} // constructor
// Person(String name,int age,boolean gender,double height,double weight){
// this.name = name;
// this.age = age;
// this.gender = gender;
// this.height = height;
// this.weight = weight;
// } // constructor
}// end class
아 아까 1시간동안 썼는데 다 사라져서 다시 썼다.. 분노 폭발을 잘 조절하고 앞으로는 저장잘하라는 배움을 했다 생각하고 다시 적었다.. ㅂㄷㅂㄷ.. 롬복 설치사용법도 다 적었는데 ..
롬복은 getter,setter등 반복적인 것을 한 번에 코드생성을 해주고 에너테이션형태로 감춰줘서 효율성이랑 가독성을 높인다.
설치사용법 - https://velog.io/@mimah/Eclipse-Lombok-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%84%A4%EC%B9%98
Author And Source
이 문제에 관하여(11일차 메소드), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@koo9b9h/11일차-메소드저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)