1. 개발 진행 상황
2. 개발 중 발생한 이슈와 해결
3. 새로 배운 것
메서드의 호출
메서드명(값1, 값2,...); //메서드를 호출하는 방법
print99danAll(); / void print99danAll()을 호출
int result = add(3,5); // int add(int x, int y)를 호출하고 결과를 result로 저장
return문: 실행 중인 메서드를 종료하고 호출한 곳으로 되돌아감
void printGugudan(int dan) {
if(!(2 <= dan && dan <= 9))
return; //dan의 값이 2~의가 아닌경우, 호출한 곳으로 되돌아감
for(int i = 1; i <= 9; i++) {
System.out.printf(%d * %d = %d%m, dan , i, dan * i);
}
return; // 반환타입이 void이므로 생략가능. 컴파일러가 자동추가
}
int multiply(int x, in y) {
int result = x * y;
return result; // 반환타입이 void가 아니므로 생략 불가
}
int max(int a, int b) {
if(a > b)
return a; // 조건식이 참일때만 실행 됨 -> 에러발생
}
int max(int a, int b) {
if(a > b)
return a; //조건식이 참일 때 실행
else
return b;//조건식이 거짓일 때 실행
}
호출 스택 (call stack): 메서드 수행에 필요한 메모리가 제공되는 공간으로 메서드가 호출되면 호출스택에 메모리 할당하고 종료되면 해제
스택(stack): 밑이 막힌 상자로 위에 차곡 차곡 쌓임, 하나의 스택에서는 하나의 메서드가 실행 됨(나머지는 대기중)
기본형 매개변수: 변수의 값을 읽기만 할 수 있음, 값을 넘기는거
class Data { int x; }
class Ex6_6 {
public static void main(String[] args) {
Data d = new Data(); //객체 생성
d.x = 10;
System.out.println("main() : x = " + d.x); // 출력1 main() : x = 10
change(d.x);
System.out.println("After change(d.x)"); // 출력3 After change(d.x)
System.out.println("main() : x = " + d.x); // 출력4 main(0 : x = 10
}
static void change(int x) { // 기본형 매개변수
x = 1000;
System.out.println("change() : x = " + x); // 출력2 chage() : x = 1000
}
}
결과
main() : x = 10
chage() : x = 1000
After change(d.x)
main(0 : x = 10
참조형 매개변수: 변수의 값을 읽고 변경 할 수 있음, 주소를 넘기는거
class Data2 { int x; }
class Ex6_7 {
public static void main(String[] args) {
Data2 d = new Data2();
d.x = 10;
System.out.println("main() : x = " + d.x); // 출력1 main() : x = 10
change(d);
System.out.println("After change(d)"); // 출력3 After change(d)
System.out.println("main() : x = " + d.x); // 출력4 main() : x = 1000
}
static void change(Data2 d) { // 참조형 매개변수
d.x = 1000;
System.out.println("change() : x = " + d.x); // 출력2 change() : x = 1000
}
결과
main() : x = 10
change() : x = 1000
After change(d)
main() : x = 1000
참조형 반환타입
class Data3 { int x; }
class Ex6_8 { //객체 생성 한다면 Ex6_8 e = new Ex6_8(); 호출은 e.copy();이런식으로 해야지만 static메서드라 객체 생성 안하고 참조변수 없이 호출
public static void main(String[] args) {
Data3 d = new Data3();
d.x = 10;
Data3 d2 = copy(d); //참조변수 없는 이유: 1. 같은 클래스 안에 있어서 2. static 메서드라서
System.out.println("d.x ="+d.x); // 출력1 d.x = 10
System.out.println("d2.x="+d2.x); // 출력2 d2.x = 10
}
static Data3 copy(Data3 d) { // 참조형 반환타입은 개체의 주소를 반환한다, static 메서드는 객체 생성 없이 호출 가능
Data3 tmp = new Data3(); // 새로운 객체 tmp 생성
tmp.x = d.x; // d.x의 값을 tmp.x에 복사
return tmp; // 복사한 객체 주소 반환
}
}
static 메서드와 인스턴스 메서드
인스턴스 메서드 | static 메서드(클래스 메서드) |
객체 생성 후 사용되는 인스턴스 변수 사용 '참조변수.메서드명()'으로 호출 |
객체 생성 없이 사용(언제나 사용 가능) '클래스이름.메서드명()'으로 호출 |
인스턴스 멤버(iv, im)와 관련된 작업을 하는 메서드 | 인스턴스 멤버(iv, im)와 관련없는 작업을 하는 메서드 |
메서드 내에서 인스턴스 변수(iv) 사용 가능 | 메서드 내에서 인스턴스 변수(iv)사용 불가 |
class MyMath2 {
long a, b; // 인스턴스 변수(iv)
// 인스턴스 메서드
long add() { return a + b; }
long subtract() { return a - b; }
long multiply() { return a * b; }
double divide() { return a / b; }
// 클래스 메서드(static 메서드)
static long add(long a, long b) { return a + b; } // a, b는 지역변수(lv), 인스턴스 변수(iv)를 사용하면 static 붙일 수 없음
static long subtract(long a, long b) { return a - b; }
static long multiply(long a, long b) { return a * b; }
static double divide(long a, long b) { return a / (double)b; }
}
class Ex6_9 {
public static void main(String args[]) {
// 클래스 메서드 호출 형식: 클래스명.메서드명(); // 객체 생성없이 호출 가능
System.out.println(MyMath2.add(200L, 100L));
System.out.println(MyMath2.subtract(200L, 100L));
System.out.println(MyMath2.multiply(200L, 100L));
System.out.println(MyMath2.divide(200L, 100L));
MyMath2 mm = new MyMath2(); // 인스턴스 생성 // 객체 생성하고 메서드 호출
mm.a = 200L;
mm.b = 100L;
// 인스턴스 메서드 호출 형식: 참조변수명.메서드명();
System.out.println(mm.add());
System.out.println(mm.subtract());
System.out.println(mm.multiply());
System.out.println(mm.divide());
}
}
static을 언제 붙여야 할까?
속성(멤버 변수) 중에서 공통 속성에 static을 붙임
class Card {
String kind; //인스턴스 변수(개별 속성)
int number
static int width = 100; //클래스 변수(공통 속성)
static int height = 250;
}
인스턴스 멤버(iv, im)을 사용하지 않는 메서드에 static을 붙임
Class MyMath2 {
long a, b;
long add() {return a + b;} // a, b는 인스턴스 변수
static long add(long a, long b) {return a + b;} // a, b는 지역 변수
}
메서드 간의 호출과 참조
static메서드는 인스턴스 변수(iv)를 사용할 수 없음
static 메서드는 인스턴스 메서드(im)를 호출할 수 없음 // 인스턴스 메서드는 인스턴스 변수를 사용하는 메서드
-
생성자(cnstructor)
인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
인스턴스 생성 시 수행할 작업(iv 초기화)에 사용
생성자의 이름은 클래스 이름과 같아야 함
리턴값이 없음(void 안붙임)
모든 클래스는 반드시 1개 이상의 생성자를 가져야 함(생성자 필수)
기본 생성자(default constructor)
매개변수가 없는 생성자
생성자가 하나도 없을 때만 컴파일러가 자동 추가 함
class Data_1 {
int value; // 생성자가 하나도 없어서 컴파일러가 기본 생성자Data_1() {} 자동 추가
}
class Data_2 {
int value;
Data_2(int x) { // 매개변수가 있는 생성자, 기본 생성자 Data_2() {}추가 필요
value = x;
}
}
class Ex6_11 {
public static void main(String[] args) {
Data_1 d1 = new Data_1(); // Data1클래스에서 자동으로 생성된 기본 생성자로인해 error발생하지 않음
Data_2 d2 = new Data_2(); // 기본 생성자 호출 compile error발생
}
}
매개변수가 있는 생성자
class Car {
String color; // 색상
String gearType; // 변속기 종류 - auto(자동), manual(수동)
int door; // 문의 개수
Car() {} // 기본 생성자
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
class Ex6_12 {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;
Car c2 = new Car("white", "auto", 4);
System.out.println("c1�� color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
System.out.println("c2�� color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
}
}
생성자 this(), this(매개변수)
같은 클래스 생성자에서 다른 생성자 호출할 때 사용
다른 생성자 호출 시 첫줄에서만 사용 가능
class Car2 {
String color; // 색상
String gearType; // 변속기 종류 - auto(자동), manual(수동)
int door; // 문의 개수
Car2() {
this("white", "auto", 4); //Car2(String color, String gearType, int door)를 호출
}
Car2(String color) {
this(color, "auto", 4);
}
Car2(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class Ex6_13 {
public static void main(String[] args) {
Car2 c1 = new Car2();
Car2 c2 = new Car2("blue");
System.out.println("c1�� color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
System.out.println("c2�� color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
}
}
참조변수 this
인스턴스 자신을 가리키는 참조변수로 인스턴스의 주소가 저장되어 있음
인스턴스 메서드(생성자 포함)에서 사용 가능(모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재)
지역변수(lv)와 인스턴스 변수(iv)구별할 때 사용
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c; //color는 인스턴스 변수(iv), c는 지역변수(lv), 같은 클래스 내에서는 this 생략 가능
gearType = g;
door = d;
}
Car(String color, String gearType, int door) {
this.color = color; // this.color는 인스턴스 변수(iv), color는 지역변수(lv)
this.gearType = gearType;
this.door = door;
}
class MyMath2 {
long a, b; // 인스턴스 변수(iv)의 진짜 이름은 this.a, this.b
MyMath2(int a, int b) { // 생성자
this.a = a; // this.a는 인스턴스 변수, a는 지역변수(lv) // 이름이 같아서 iv와 lv 구분 안가서 this 붙임
this.b = b;
}
long add() { // 인스턴스 메서드
return a + b; // return this.a + this.b; this는 생략 가능
// 클래스 메서드(static 메서드)
static long add(long a, long b) { return a + b; } // a, b는 지역변수(lv), 인스턴스 변수(iv)라서 this가 오는 경우x , 인스턴스 변수는 static 붙일 수 없음
static long subtract(long a, long b) { return a - b; }
static long multiply(long a, long b) { return a * b; }
static double divide(long a, long b) { return a / (double)b; }
}
-
변수의 초기화
지역변수(lv)는 수동 초기화 해야함
-
상속(Inheritance)
기존의 클래스로 새로운 클래스를 작성하는 것 -> 코드의 재사용
두 클래스를 부모와 자식으로 관계 맺어주는 것
class 자식클래스 extends 부모클래스 {
//...
}
자손은 조상의 모든 멤버를 상속받음(생성자, 초기화 블럭 제외)
자손의 멤버 개수는 조상보다 적을 수 없음(같거나 많다)
자손의 변경은 조상에 영향을 미치지 않음
class Tv {
boolean power; // 전원상태(on/off)
int channel; // 채널
void power() { power = !power; }
void channelUp() { ++channel; }
void channelDown() { --channel; }
}
class SmartTv extends Tv { // smartTv는 Tv에 Caption)자막)을 보여주는 기능
boolean caption; // 캡션 상태(on/off)
void displayCaption(String text) {
if (caption) { // 캡션 상태가 on(true)일 때만 text를 보여줌
System.out.println(text);
}
}
}
class Ex7_1 {
public static void main(String args[]) {
SmartTv stv = new SmartTv();
stv.channel = 10; // 조상 클래스로부터 상속받은 멤버
stv.channelUp(); // 조상 클래스로부터 상속받은 멤버
System.out.println(stv.channel);
stv.displayCaption("Hello, World");
stv.caption = true; // 캡션(자막)기능을 켠다
stv.displayCaption("Hello, World");
}
}
포함 관계
포함(composit)
클래스의 멤버로 참조변수를 선언하는 것
작은 단위의 클래스를 만들고 이 들을 조합해서 클래스를 만듦
클래스 간의 관계 결정하기
상속관계: A는 B이다.(is-a) Circle is a Point
포함관계: A는 B를 가지고있다.(has-a) Circle has a Point // 보통 포함 관계가 많이 쓰임
4. 참고 레퍼런스
5. 오늘 한 일 / 회고
6. TO-DO LIST
7. 특이사항
'개발 일지' 카테고리의 다른 글
[TIL]이노베이션 캠프 12일차 (0) | 2022.08.12 |
---|---|
TIL]이노베이션 캠프 11일차 (0) | 2022.08.12 |
[TIL]이노베이션 캠프 9일차 (0) | 2022.08.09 |
[TIL]이노베이션 캠프 8일차 (0) | 2022.08.08 |
[WIL]이노베이션 캠프 1주차 (0) | 2022.08.08 |