국비 8일차_1

강지수·2023년 12월 21일
0

국비교육

목록 보기
15/97

지난 시간 복습

method 를 쓰는 이유

같은 기능을 하기 위해 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를 통해 값을 전달하고 전달받는 걸 '캡슐화' 라고 한다.


캡슐화 (Encapsulation)

캡슐화란 객체의 데이터(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를 많이 사용한 상태로 시작하게 된다.


final 상수

이 프로그램 안에서 RECTANGLE 이라는 대문자 문구는 1과 같은 의미이다.
숫자로 받을 data를 문자화 시키는 방법

final 상수는 바뀌지 않는다. (변경할 수 없다)

profile
개발자 준비의 준비준비중..

0개의 댓글