밤빵's 개발일지
[TIL]20240625 3주차부터 천천히...!! 본문
작은 목표를 세우기로했다. 지금은 스프링까지는 들어보자! 로 3~4주차를 천천히 공부하는 중.
제일 느린거같긴한데 어쩔수없지. 원래 어려운거랬어......
스프링 들으면서는 팀 프로젝트까진 해보자! 경험은 좋은거니까
팀 프로젝트 하면서는 개인으로 하나는 만들어야되지 않겠어? 이렇게!!!
일단은...그렇다....
오늘까지 공부한 3주차 정리!
▶ 메서드란?
메서드(method)는 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것이다. 기본적으로 수학의 함수와 유사하고, 어떤 값을 입력하면 이 값으로 작업을 수행해서 결과를 반환한다.
반환타입 메서드이름 (타입변수명, 타입변수명......) { // 선언부
// 메서드 호출시 수행될 코드
} // {} 구현부
int add(int a, int b) {
int result = a + b;
return result; // 호출한 메서드로 결과를 반환한다.
}
메서드는 크게 선언부와 , 구현부로 이루어져있다. 위 형식처럼 메서드를 정의한다.
▶ return문
메서드의 반환타입이 'void'가 아닌경우 구현부 안에 반드시 return값이 포함되어있어야 한다.
작업을 수행한 결과인 반환값을 호출한 메서드로 전달하는데, 이 값의 타입은 반환타입과 일치하거나 적어도 자동 형변환이 가능한 것이어야한다. 매개변수와 달리 return문은 단 하나의 값만 반환할 수 있다.
int add(int x, int y) {
int result = x + y;
return result;
}
변수 result의 타입이 int 이므로 메서드 add의 반환타입이 일치한다.
" 'void'인 경우 컴파일러가 메서드의 마지막에 return;을 자동적으로 추가해준다.
'void'가 아닌경우, 그러니까 반환값이 있는 경우 반드시 return문이 있어야한다. 없으면 컴파일에러....."
▶ 기본형 매개변수
메서드의 매개변수를 기본형으로 선언하면 단순히 저장된 값만 얻는다(복사본). 값을 읽기만 할 수 있다.
원본이 아닌 복사본이 변경되도 원본에는 아무런 영향을 끼치지 못한다. 기본형 매개변수는 변수에 저장된 값만 읽을 수만 있을 뿐 변경할 수는 없다.
▶ 참조형 매개변수
참조형은 이름처럼 참조형이라 값이 아니라 '값이 저장된 주소'를 메서드에게 넘겨주기 때문에 값을 읽어오는 것 뿐만 아니라 변경하는 것도 가능하다.
▶ 참조형 반환타입
매개변수뿐만 아니라 반환타입도 참조형이 될 수 있다. 반환하는 값의 타입이 참조형이라는 말.
반환하는 값의 타입이 "실제값의 주소" 라는 의미!
▶ static메서드와 인스턴스 메서드
메서드 앞에 static이 붙어있으면 '클래스메서드'이고 붙어있지않으면 '인스턴스메서드'이다.
클래스 메서드도 클래스변수처럼, 객체를 생성하지 않고도 '클래스이름.메서드이름(매개변수)' 와 같은 식으로 호출이가능하다. 반면 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다.
class MyMath2 {
long a, b;
// 인스턴스 변수 a, b만을 이용해서 작업하므로 매개변수가 필요없다.
long add() {
return a + b; // a, b는 인스턴스 변수
}
long subtract() {
return a - b;
}
// 인스턴스 변수와 관계없이 매개변수만으로 작업이 가능하다.
static long add(long a, long b) {
return a + b; // a, b는 지역변수
}
static long subtract(long a, long b) {
return a - b;
}
인스턴스 메서드인 add(), subtract()는 인스턴스 변수인 a와 b만으로도 충분히 작업이 가능하기 때문에, 매개변수를 필요로 하지 않기때문에 괄호()에 매개변수를 선언하지 않았다. 반면 add( long a, long b ) , subtract( long a, long b )는 인스턴스 변수 없이 매개변수만으로 작업을 수행하기 때문에 static을 붙여서 클래스메서드로 선언한다.
public static void main(String[] args) {
// 클래스 메서드 호출. 인스턴스 생성없이 호출가능
System.out.println(MyMath2.add(200L, 100L));
System.out.println((MyMath2.subtract(200L, 100L));
MyMath2 mm = new MyMath2(); // 인스턴스 생성
mm.a = 200L;
mm.b = 100L;
// 인스턴스 메서드는 객체생성 후에만 호출이 가능하다.
System.out.println(mm.add());
System.out.println(mm.subtract());
}
}
클래스 메서드는 객체생성없이 바로 호출이 가능했고, 인스턴스 메서드는 MyMath2클래스의 인스턴스를 생성한 후에야 호출이 가능하다.
▶ static은 언제 붙이나용?
1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용 하는 것에 static을 붙인다.
- 생성된 각 인스턴스는 서로 독립적 이기 때문에 각 인스턴스의 변수는 서로 다른 값을 유지한다.
그러나 모든 인스턴스에서 같은 값이 유지어야 하는 변수는 static을 붙여서 클래스 변수로 정의해야 한다.
2. 클래스 변수(static 변수)는 인스턴스를 생성하지않아도 사용할 수 있다.
- static이 붙은 변수(클래스 변수)는 클래스가 메모리에 올라갈 때 이미 자동적으로 생성되기 때문.
▶ 메서드 오버로딩 (method overloading)
함수가 하나의 기능만을 구현하는 것이 아니라 하나의 메서드 이름으로 여러기능을 구현하도록 하는 java의 기능.한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라고 매개변수의 개수, 타입, 순서가 다르면 동일한 이름을 사용해서 메서드를 정의할 수 있다.
→ 오버로딩의 조건
1. 메서드 이름이 같아야 한다.
2. 매개변수의 개수 또는 타입, 순서가 달라야 한다.
3. 반환 타입은 관계없다.
응답값만 다른것은 오버로딩 X
접근제어자만 다른것도 오버로딩 X
→ 오버로딩의 장점
메서드의 이름 하나로 상황에 따른 동작을 개별로 정의할 수 있다.
결론: 오버로딩은 매개변수의 차이로만 구현할 수 있다.
" 위의 조건을 만족시키지 못하는 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다는 것에 주의! "
▶ 상수
앞에 final을 붙이면 상수. final필드는 반드시 초기값을 지정. 초기값이 저장되면 해당값을 프로그램이 실행하는 도중에는 절대로 수정할 수 없다.
final String company = "GENESIS";
...
Car car = new car();
System.out.println(car.company);
Car.company = "Benz"; // 수정 불가능
static final String COMPANY = "GENESIS";
System.out.println(car.COMPANY);
인스턴스마다 상수를 저쟝할 필요없다. 사용방법은 클래스필드와 동일하지만 수정이 불가능!
→ 보통은 카멜 케이스로 testString 이렇게 쓰는데 상수는 all 대문자다. 대문자들만 있으면 이거 상수구나! 하면 된다.
▶ 생성자 (constructor)
생성자는 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'. 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 하는 작업을 위해서도 사용된다. 메서드 처럼 클래스 내에 선언되며, 구조도 메서드와 유사하지만 리턴값이 없다는 점이 다르다. 그렇다고 해서 생성자 앞에 리턴값이 없음을 뜻하는 키워드 void를 사용하지는 않고,
아무것도 적지않는다.
→ 생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야한다.
2. 생성자는 리턴 값이 없다.
- 모든 클래스는 반드시 생성자를 가져야 한다.
→ void를 생략할 수 있는 이유?
생성자도 메서드 이기 때문에 리턴값이 없다는 의미의 void를 붙여야하지만 모든 생성자가 리턴값이 없으므로 void를 생략할 수 있게 한 것.
클래스이름(타입 변수명, 타입 변수명, ...) {
// 인스턴스 생성 시 수행 될 코드
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
생성자 정의. 생성자도 오버로딩이 가능해서 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
▶ 기본 생성자 (default constructor)
사실.... 지금까지는 생성자가 뭔지 모르고 있었는데 모든 클래스에는 반드시 하나이상의 생성자가 정의되어 있어야 한다. 지금까지 생성자를 정의하지않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 기본 생성자 덕분!
class Data_1 {
int value;
}
class Data_2 {
int value;
Data_2(int value) {} // 기본 생성자 추가
Data_2(int x) {
value = x;
}
}
class Test {
public static void main(String[] args) {
Data_1 d1 = new Data_1();
Data_2 d2 = new Data_2();
}
}
// 기본 생성자 추가 부분을 넣지않으면 컴파일 에러가 난다.
" 기본 생성자가 컴파일러에 의해서 추가되는 경우는 클래스에 정의된 생성자가 하나도 없을 때 뿐이다."
▶ 매개변수가 있는 생성자
생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 인스턴스마다 다른 값으로 초기화되어야 하는 경우가 많기 떄문에 매개변수를 사용한 초기화는 매우 유용하다.
class Car {
String color; //색상
String gearType; // 변속기 종류 - auto (자동), manual(수동)
int door; // 문의 개수
Car () {} // 기본 생성자
Car (String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
}
Car인스턴스를 생성할 때, 생성자 Car()를 사용한다면 인스턴스를 생성한 다음에 인스턴스 변수들을 따로 초기화 해주어야 하지만 매개변수가 있는 생성자 Car(String color, String gearType, int door) 을 사용하면 인스턴스를 생성하는 동시에 원하는 값으로 초기화를 할 수 있게된다.
Car c = new Car ();
c.color = "white";
c.gearType = "auto";
c.door = 4;
Car c = new Car("white", "auto", 4);
위 아래 두 코드는 같은 내용이다. 하지만 밑의 코드가 좀더 간결하고 직관적이다. 이렇게 클래스를 작성 할 때 다양한 생성자를 제공해서 인스턴스 생성 후 별도로 초기화를 하지 않아도 되게하는 것 이 좋다.
🤓 오늘의 회고
오늘안에 3주차를 끝내는게 목표였는데, 아직 반정도? 가장 중요한 부분들이 남았다. 그냥 Spring은 28일 부터 듣는다 생각하고 부지런히 공부하기로 마음먹었다. 4주차 강의는 한 번도 들어본 적이 없어서 조원분께 물어봤더니 또 좌절이 있을수도 있다고해서 3주차를 잘 익혀나갈 계획 중... 이라고 긍정적으로 생각하고싶지만 주차가 지나갈수록 계속 어려워져서 자꾸 멘탈이 팔랑팔랑.. 오늘도 열심히 당근을 받고 마음을 다시 잡았다.
Git도 내 포트폴리오가 될 수 있다고 해서 시도해보려고 했는데 도무지 시간이 빠지질 않는다. 아니 강의만 주구장창 들었는데 왜 반밖에 못들었지?! 습관적으로 되돌려보고 있는건지 그래도 다른 강의와 책을 병행하니 조금은 알아가고 있는 것 같기도? 하다. 너무 어렵지만.. 하기싫은건 아니라서 Spring강의가 친절하고 재밌다고 하니까 그건 꼭 들어보려고 남아있는 중! 얼른 공부하러 가야겠다.
'개발Article' 카테고리의 다른 글
[TIL]20240627 3주차 마무리 ② (0) | 2024.06.28 |
---|---|
[TIL]20240626 3주차 마무리 ① (0) | 2024.06.27 |
[TIL]20240624 JAVA3주차 다시 시작! (0) | 2024.06.25 |
[WIL]20240623 객체지향프로그래밍/JVM (0) | 2024.06.23 |
[TIL]20240622 페어프로그래밍(내 코드는 내가 이해해야지..!) (0) | 2024.06.23 |