지난 시간 복습
같은 기능을 하기 위해 main 함수 안에서 길고 많은 양의 코드를 작성해야 한다 => 생산성이 낮다.
method 를 쓰게 되면 간결한 코드를 사용해서 기능을 쓸 수 있다 => 생산성이 높다.
매개변수가 없는 method 는 고정되있는 값만 불러올 수 있다.
매개변수를 이용하면 같은 기능을 가진 method에 각각 다른 값들을 넣은 결과를 얻을 수 있다.
코드가 진행하는 흐름을 잘 캐치해서 코드를 짜야 한다.
한번에 모든 코드를 쫘라락 쓸 수는 없다.
void : return 이 없다.
return 은 호출한 곳으로 return 된다.
return 값은 1개만, 2개 이상을 return 하려면 묶어서 하면 된다.
public static void main(String[] args) {
MethodExample6 m1=new MethodExample6();
double rsum=m1.makeSum(1,10d, 100f, "홍길동");
float rsum2=m1.makeSum(50f, 100);
System.out.println("rsum:"+rsum);
System.out.println("rsum2:"+rsum2);
}
public float makeSum(float a,int b) {
float start=a;
int end=b;
float sum=0;
for (float i=start;i<end;i++) {
sum+=i;
}
return sum;
}
public double makeSum(int a,double b,float c,String d) {
double sum=a+b+c;
return sum;
}
결과
rsum:111.0
rsum2:3725.0
method 이름이 같더라도 매개변수나 기능에 따라 다른 함수가 된다.
class : 객체를 정의하는 틀 또는 설계도
class는 field와 method로 구성된다.
생성자 속의 this keyword 는 다른 생성자를 호출 하는 기능
public static void main(String[] args) {
// 생성자 (Constructor)
Car car0=new Car(); // 기본 생성자 호출
Car car1=new Car(15); // 사용자 생성자 호출
Car car2=new Car(10,20); // 사용자 생성자 호출
Car car3=new Car(10,20,30f);
}
public Car() {
// System.out.println("기본생성자 호출");
this(10,20); // 다른 생성자 호출
}
public Car(int i) {
System.out.println("사용자생성자 호출 "+i);
}
public Car(int i, int j) {
System.out.println("사용자생성자 호출 "+i+" : "+j);
}
public Car(int i, int j, float k) {
System.out.println("사용자생성자 호출 "+i+" : "+j+" : "+k);
}
결과
사용자생성자 호출 10 : 20
사용자생성자 호출 15
사용자생성자 호출 10 : 20
사용자생성자 호출 10 : 20 : 30.0
생성자(Constructor) 는 new 연산자로 객체를 생성할 때 객체의 초기화 역할을 담당한다.
선언 형태는 method 와 비슷하지만, return 타입이 없고 이름은 class 이름과 동일하다.
생성자 오버로딩 (Overloading) 은 매개변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.
생성자 오버로딩이 많아질 경우 매개변수의 수만 다르고 필드 초기화 값은 비슷한 중복 코드가 발생할 수 있다.
이 경우 'this' 를 사용하여 공통코드를 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있따.
Car(String model) {
this(model,"은색",250); //중복 코드 호출
}
Car(String model, String color) {
this(model,color,250); // 중복 코드 호출
}
Car(String model,String color,int maxSpeed) {
this.model=model;
this.color=color;
this.maxSpeed=maxSpeed;
}
public class Car {
String color="noncolor";
String model;
public static void main(String[] args) {
Car car4=new Car("검정","x5");
}
public Car(String color,String model) {
this.color=color;
this.model=model;
}
}
Car method에서 어떤 color 가 어떤 color 인지 구별하기 위해 this를 써서
this.color = 전역변수 color (field)
color = 매개변수 color
임을 명시해준다.
com.tech.gt002 package 생성
PigSave class 생성 (main 함수 포함)
PigSaveTest class 생성 (main 함수 x, main 에서 사용할 method만 존재)
접근 제한자 (접근 지정자 / Access Modifier)
public, protected, default, private 의 4가지가 있음.
아무것도 안쓰면 default 상태
미션
학생 이름을 전달하고
해당 비밀번호를 return 받기
ex) 홍길동 - 1234
홍길순 - 5678
main 에서 출력
출력 내용 : 홍길동 비밀번호는 1234이다.
강사님의 코드
홍길동
홍길순
원하는 class 우클릭 - Source - Get Getters and Setters 클릭
getPass() 체크 - Insertion point (삽입 위치) 확인 - Generate
getPass method 가 생성된다.
이렇게 직접 전달하지 않고 method를 통해 값을 전달하고 전달받는 걸 '캡슐화' 라고 한다.
캡슐화란 객체의 데이터(field), 동작(method) 을 하나로 묶고 실제 구현 내용을 외부에 감추는 것을 말한다. 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 field 와 method 만 이용할 수 있다.
캡슐화하는 이유는 외부의 잘못된 사용으로 인해 객체가 손상되지 않도록 하는 데 있다.
(외부에서 객체 내부의 변수 등을 변경시켜 객체가 손상될 수 있기 때문)
ItemTrans 에 getItem method 를 만들어서 활용
main 에서
"점프" 를 전달하면 1000 값 을 return
"더블점프" : 3000
"적군 킬" : 5000
전체 포인트 출력출력 내용
포인트:1000
포인트:3000
포인트:5000
전체 포인트:9000
내가 짠 코드
public class ItemTrans {
private int point;
private int total;
public int getPoint() {
return point;
}
public int getTotal() {
return total;
}
public void pointGet(String action) {
if(action=="점프") point=1000;
else if(action=="더블점프") point=3000;
else if(action=="적군 킬") point=5000;
}
public void pointTotal() {
total+=point;
}
}
ItemTrans.java
public class JumpTest {
public static void main(String[] args) {
ItemTrans itemTrans=new ItemTrans();
String jump="점프";
String doubleJump="더블점프";
String kill="적군 킬";
itemTrans.pointGet(jump);
System.out.println("포인트:"+itemTrans.getPoint());
itemTrans.pointGet(doubleJump);
System.out.println("포인트:"+itemTrans.getPoint());
itemTrans.pointGet(kill);
System.out.println("포인트:"+itemTrans.getPoint());
itemTrans.pointTotal();
itemTrans.getTotal();
System.out.println("전체 포인트:"+itemTrans.getTotal());
}
}
JumpTest.java
결과
포인트:1000
포인트:3000
포인트:5000
전체 포인트:5000
오류 발생
total 점수를 구할 때, if문 밖에 있기 때문에 최종적인 point값만 더해짐
즉, 누적이 아닌 최종값만 더해져서 누적값이 나오지 않음.
+ 필요없는 변수 설정이나 중복코드가 많음. 더 연습 필요
강사님의 코드
package com.tech.gt003;
public class ItemTrans2 {
private int point;
private int total;
public int getPoint() {
return point;
}
public int getTotal() {
return total;
}
public void getItem(String skill) {
if(skill=="점프") {
point=1000;
total+=point;
} else if(skill=="더블점프") {
point=3000;
total+=point;
} else if(skill=="적군킬") {
point=5000;
total+=point;
}
}
}
ItemTrans2.java
package com.tech.gt003;
public class JumpTest2 {
public static void main(String[] args) {
ItemTrans2 its=new ItemTrans2();
its.getItem("점프");
System.out.println("포인트:"+its.getPoint());
its.getItem("더블점프");
System.out.println("포인트:"+its.getPoint());
its.getItem("적군킬");
System.out.println("포인트:"+its.getPoint());
System.out.println("최종포인트:"+its.getTotal());
}
}
JumpTest2.java
결과
포인트:1000
포인트:3000
포인트:5000
최종포인트:9000
com.tech.gt004.stat package 생성
StaticBlockEx class 생성
public class StaticBlockEx {
// static Block 한번만 호출
static {
System.out.println("static Block");
}
public static void main(String[] args) {
StaticBlockEx bx1=new StaticBlockEx();
StaticBlockEx bx2=new StaticBlockEx();
StaticBlockEx bx3=new StaticBlockEx();
bx1.doPrt();
bx1.doPrt();
bx1.doPrt();
bx1.doPrt();
}
private void doPrt() {
System.out.println("Aprint");
}
}
결과
static Block
Aprint
Aprint
Aprint
Aprint
static 에 대한 설명을 해주셨는데 이해를 못함.
Calculator class 생성
public class Calculator {
private double add(double x,double y) {
return x+y;
}
private double sub(double x,double y) {
return x-y;
}
private double multi(double x,double y) {
return x*y;
}
private double div(double x,double y) {
return x/y;
}
public static void main(String[] args) {
Calculator cal=new Calculator();
double returnVal1=cal.add(7,5);
System.out.println(returnVal1);
double returnVal2=cal.sub(7,5);
System.out.println(returnVal2);
double returnVal3=cal.multi(7,5);
System.out.println(returnVal3);
double returnVal4=cal.div(7,5);
System.out.println(returnVal4);
}
}
결과
12.0
2.0
35.0
1.4
static keyword 사용
public class Calculator2 {
private static double add(double x,double y) {
return x+y;
}
private static double sub(double x,double y) {
return x-y;
}
private static double multi(double x,double y) {
return x*y;
}
private static double div(double x,double y) {
return x/y;
}
public static void main(String[] args) {
// Calculator2 cal=new Calculator2();
double returnVal1=add(7,5);
System.out.println(returnVal1);
double returnVal2=sub(7,5);
System.out.println(returnVal2);
double returnVal3=multi(7,5);
System.out.println(returnVal3);
double returnVal4=div(7,5);
System.out.println(returnVal4);
}
}
결과
12.0
2.0
35.0
1.4
static 을 사용하면 static 을 사용하자마자 메모리에 저장되기 때문에 객체를 쓰지 않아도 그 method는 사용이 가능하다.
=> program 실행 시 초기에 memory를 많이 사용한 상태로 시작하게 된다.
이 프로그램 안에서 RECTANGLE 이라는 대문자 문구는 1과 같은 의미이다.
숫자로 받을 data를 문자화 시키는 방법
final 상수는 바뀌지 않는다. (변경할 수 없다)