어제 알고리즘 스터디를 다녀와서 내가 static개념도 없구나..🫣 충격먹고 다시 개념잡기 위한 공부.
공부일 : 2022-05-18
공부범위 : p.212-p.269
학습 자료 : 혼자 공부하는 자바 - 신용권 지음
객체
- 속성과 동작을 가지고 있는 것.
- 자동차 객체는 색상, 인원수라는 속성을 가지고 있고, 달리다, 멈추다 라는 동작을 가지고 있다.
객체 호출 방식
- 객체. 메서드(매개 값 1, 매개 값 2..)
- 도트 연산자는 객체의 필드와 메서드에 접근할 때 사용한다.
클래스
- 객체는 하늘에서 갑자기 떨어지는 게 아니라 설계도를 통해 만들어내야 한다.
- 자바의 설계도가 클래스이다.
- 클래스에는 객체를 생성하기 위한 필드와 메서드가 정의되어있다.
- 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 한다. [ 클래스 -> 객체(인스턴스) ]
public class Car {
}
public class Car {
}
class tire{
}
일반적으로 소스 파일당 하나의 클래스를 선언한다. 하지만 두 개 이상의 클래스 선언도 가능하다.
소스 파일은 클래스 선언을 담고 있는 저장 단위일 뿐 , 클래스 자체가 아니다.
`public`접근 제한자는 파일 이름과 동일한 이름의 클래스 선언에만 붙일 수 있습니다.
객체 생성
현실에서 물건의 위치를 모르면 물건을 사용할 수 없듯이, 객체지향 프로그램에서도 메모리 내에서 생성된 객체의 위치를 모르면 사용할수 없다. 그래서 new연산자는 힙 영역(메모리)에 객체를 생성시킨 후 객체의 번지를 리턴한다.
//car1이라는 인스턴스
Car car1 = new Car();
//car2이라는 인스턴스
Car car2 = new Car();
Car라는 클래스로 각기 다른 두 개의 고유 인스턴스를 만들었다.
클래스는 하나지만 2개의 인스턴스는 메모리에 생성되었다.
클래스의 구성 멤버
//클래스 = 설계도
public class Car {
//필드
String color;
int size;
//생성자
public Car() {
}
//메소드
void methodName(){
}
}
필드
- 객체의 속성
- 변수와는 엄연히 다르다. 변수는 생성자와 메서드가 실행종료되면 자동 소멸된다. 하지만 필드는 생서자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다. 필드와 변수의 차이점
//필드
String color = "빨강";
int size;
필드를 선언할 때 [= "값"] 이렇게 값을 초기화할 수 있다
초기화를 하지 않는 경우 기본 초기값이 설정된다.
생성자
- 객체 생성 시 초기화 역할을 담당한다. 필드를 초기화하거나 메서드를 호출해서 객체를 사용할 준비를 한다.
- 메서드와 비슷해 보이지만, 리턴 타입도 없고 클래스 이름으로 되어있다는 점이 다르다.
- 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다.
- 기본 생성자는 선언을 생략했다고 해도, 자동으로 추가된다. 반대로 클래스에 명시적을 선언한 클래스가 한 개라도 있는 경우 자동으로 클래스가 추가되지 않는다.
객체 초기화란?
객체 생성과 같은 것. 클래스로부터 인스턴스(객체)를 만들어 메모리에 올려둠으로써 사용 준비를 함
this()
생성자 오버로 등이 많아질 경우 생성자 간의 중복된 코드를 줄이는 데 사용함
필드 초기화 내용은 한 생성자에게만 집중적으로 작성하고 나머지 생서자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 사용
public Car(String color) { //-1
this(color, 4);
}
public Car(int size) { //-2
this("빨강", size);
}
public Car(String color, int size) { //-3
this.color = color;
this.size = size;
}
1, 2에서의 this는 3 생성자를 가리키는 것이다.
메서드
- 동작, 괄호 안에 들어가는 값을 매개변수라 부른다.
매개변수의 개수를 모를 경우
Car.java
~
//메소드
void methodName(int[] arr){
}
~
Main.java
public class Main {
public static void main(String[] args) {
//매개변수 배열로 넣기
int[] arr = {1,2,3,4};
//생성자를 만들어 주어야 매서드 접근이 가능함
Car car = new Car();
car.methodName(arr);
}
}
매개변수의 개수를 모를 경우 배열로 만들어서 매개변수로 넣을 수 있다.
이런 경우 메서드 호출전에 배열을 생성해야하는 불편함이 있다.
그래서 배열을 생성하지 않고 값의 목록만 넘겨주는 방법도 있다.
Car.java
~
//메소드
void methodName(int ...arr){
}
~
Main.java
public class Main {
public static void main(String[] args) {
//생성자를 만들어 주어야 매서드 접근이 가능함
Car car = new Car();
car.methodName(1,2,3);
}
}
메소드 오버 로딩
- 리턴 타입, 메서드 이름이 같고 매개변수의 타입, 개수, 순서가 달라야 한다.
//메소드
void methodName(int[] arr){
}
double methodName(int[] brr){
}
매개변수의 타입과 개수, 순서가 똑같은 경우 매개변수 이름이 다르다고 해서 이것을 메서드 오버로딩이라고 하지 않는다.
리턴 타입만 다르고 매개 변수가 동일하다면 이것도 오버로딩이 아니다.