1. 자바의 기초부터 Object-Oriented 까지
우선 자바에 대해 먼저 알아보자

자바는 어떤 언어일까?

- Java는 인터프리터 언어(Python처럼 한 줄씩 실행)와 다르게, 컴파일된 언어
- 우리가 .java 파일을 작성하면, 먼저 컴파일러(Compiler)가 이를 변환하는 과정이 필요하다.(바이트 코드로 변환)
- 바이트 코드는 .class 파일로 JVM이 이를 해석하고 실행해준다.

=> 운영체제 상관없이 실행이 가능해진다!!

== 는 메모리 주소를 비교하고, .equals()는 값을 비교하게 해준다.
문자열 같은 reference 변수는 .equals()를 사용해야 그 값을 비교할 수 있다!! (==는 주소값을 비교하기 떄문이다.)
자바는 객체 지향 언어이다.
이는 자바의 아주 중요한 특성중 하나이다.
여기서 클래스와 메소드 개념이 등장한다11
✔ 클래스(Class): 프로그램에서 하나의 개념이나 객체를 만들기 위한 blueprint(설계도)
✔ main() 메서드: 프로그램이 시작되는 진입점 (entry point)

class를 기반으로 instance를 만들어 사용한다. : instance는 개별적인 데이터 조각!
Constructor: class가 instance를 생성할때 자동으로 호출되는 method !
역할: instance를 초기화함
특징: class이름과 동일한 이름을 가진다.

여기서 Car라는 class를 사용한 객체 ferrari는 new Car() 라는 constructor method를 사용해 생성된다.
method를 사용하면 reference 변수가 된다.
이게 무슨 말이냐면

int num으로 생성한 변수에는 10이라는 값이 저장되지만, ferrari는 Car객체의 메모리 주소가 저장되는 것이다.

쉽게 말하면 그 값을 가지고 있는게 아니라 그 값을 가지고 있는 상자를 가리키고 있는! 그 주소만 가지고있는 것이다.
Constructor: 생성자

Store class 안에 constructor를 생성했다. 이제 저 클래스를 이용해서 객체를 만든다면 저 public Store(){}안에 있는 코드가 생성될것 이다.

결과!! 나 안에 있어요!!
Instance Fields (객체의 변수들) :
클래스 내부에 선언된 변수로, 각 instance마다 개별적인 값을 가진다.

이런식으로 변수를 생성! 이 class에 필요하고 내가 쓸 변수들이에요!!
단, constructor와는 분리해서 사용해야한다.
Classes: Constructor Parameters : 생성자 매개변수
생성자에 매개변수를 추가하면, 객체를 만들면서 데이터를 전달할 수 있다.
이렇게 전달받은 값을 인스턴스 변수(instance field)에 저장할 수 있음

Method Signature (메서드 시그니처)
: 메서드(constructor포함) 은 Signiture를 가진다.

시그니처(Signature) 구성요소: 메서드 이름 + 매개변수 개수 + 매개변수 타입
앞의 예제에서 시그니처는 Car(String carColor)이다.
목적: 식별자 개념으로 사용 (실제로 실행되는 코드가 아님)
Constructor Overloading(생성자 오버로딩):
같은 class에 여러개의 constructor 정의 가능!

각 생성자의 매개변수 개수와 타입이 다르면, Java 컴파일러가 적절한 생성자를 선택함.
즉, 어떤 생성자를 사용할지 결정하는 기준은 시그니처(Signature: 생성자 이름 + 매개변수 타입 + 개수)
! 이래서 signature가 중요한 거였다!
Default Constructor(기본 생성자):
class에 생성자를 정의하지 않으면, Java 컴파일러가 자동으로 기본 생성자를 생성함.
기본 생성자는 매개변수가 없고, 인스턴스 변수에 기본값을 할당함.
constructor를 사용하면 좋은 점 !

✅ 객체를 생성하면서 바로 값 설정 가능
✅ 초기 값을 안전하게 설정할 수 있음
✅ 코드를 더 깔끔하게 유지할 수 있음
즉, 생성자를 활용하면 객체를 만들 때 원하는 값으로 초기화할 수 있어서 코드가 더 간결해진다!
Dot 연산자. (.)

객체의 field 나 method에 접근할 때 사용하는 연산자.

최종 정리


이번에는 method에 대해 자세히 알아보겠다!
일단 method가 뭘까?
앞에서 본 것처럼 특정 작업을 수행하는 코드 블록이다! 마치 함수처럼~~

- public → 접근 제어자 (어디서든 호출 가능)
- void → 반환 타입 (값을 반환하지 않음)
- deposit → 메서드 이름
- (double amount) → 매개변수 (입금할 금액을 전달)
Method Decomposition (메서드 분리):
하나의 큰 문제(예: 은행 계좌 관리)를 여러 개의 작은 문제(입금, 출금, 잔액 조회)로 쪼개서 해결 가능!
deposit(), withdraw(), checkBalance() 같은 메서드로 기능을 나누면 코드가 재사용 가능하고, 유지보수하기 쉬워짐

return
: method는 값을 return 할수도 있고, 그냥 실행만 할 수도 있다.

여기서는 void때문에 결과를 반환하지 않고 단순히 balance를 변경한다.

여기까지 method를 사용하면서 느낀점은 python의 함수랑 상당히 비슷하다는 점이었다!
차이점은 자바의 method는 해당 class안에 존재한다는 점이고, 함수는 부르기만 하면 쓸 수 있다는 점이었다.

이렇게 긴 코드를 사용하기 보다 method를 이용하면 한 번에 쉽게 다룰 수 있다.
저 method 코드에서 public이 왜 선언되지 않았는지 궁금했는데 public을 사용하면 외부패키지에서 건들 수 있는 변수가 되는 것이다. 따라서 잔액(balance)를 보호하기 위해 default 변수로 사용한 것이다.
Calling Methods(메소드 부르기=사용):
자바를 사용할 때 public static void main(String[] args)라는 걸 처음에 쓰는걸 볼 수 있다. 이것도 method이다!!

non-static method 즉 static이 없는 위에 우리가 만든것과 같은 method일 경우!! 객체가 있어야 호출이 가능하다!!
이건식으로 객체 myFasterCar이 있어야 startEngine이라는 method를 호출할 수 있다.
그렇다면 static mtehod는?

이렇게 클래스 이름만으로도 호출이 가능하다. (객체없이!)
Scope(변수의 범위)
method안에 있는 변수는 지역변수임-> 오직 그 method안에서만 사용가능
class에서 선언된 변수는 클래스 전체에서 사용 가능

이렇게 productType은 사용가능하지만 method안에있는 message는 꼭! 그 안에서만 사용할수 있다.
Adding Parameters:
매개변수

Method 에서 변수를 쓰고싶다면 parameter value를 추가해서 쓰면 된다. 마치 constructor처럼,,
Reassigning Instance Fields
: 변수에 값을 줘보자!

사진처럼 값을 불러오면 출력이 가능하다. 이 값은 increasePrice에 의해서 바뀐 price를 출력!!
Returns:
참조값

이 경우에는 값만 받기 때문에 다른 상자에 있다고 생각

객체의 경우에는 주소(=reference)를 받기 때문에 하나의 색을 바꾸면 다른 쪽도 똑같이 바뀐다.
다음 코드 예시에서 함께 살펴보자

이 코드에서 myCarLot안의 carInLot에는 myCar의 주소가 들어간다.
The toString() Method

자바에서 String 변수값을 얻고싶었는데 주소값이 나올때가 있다.
java에서 toString()을 호출해서 쓰기때문이다.

하지만 우리는 주소값을 해석할수도 쓸수도 없다..
아 이런 쓸데없는 값을 그냥 아예 안 받고 싶다.. 해결책이 없을까?
있따!!

먼저 우리가 그냥 toString() method를 뺏어 쓰는것이다 ㅋㅋ
toString() method를 class에 지정하면 우리는 return 할 때 String값을 얻을 수 있다.

위의 코드를 보면 toString을 String값을 return 하는 method로 지정했기 때문에 myCar을 print하면 This is a red car! 라는 문장이 출력된다.
여기까지 codeacademy의 oop에 대한 내용이다.

열공 화이팅~ 내 스터디 팀원들도 화이팅~