JAVA/JAVA 공부

Java 개념 다시 공부하기 DAY1 - 객체, 클래스, 인스턴스, 필드, 메서드, 오버로딩

어제 알고리즘 스터디를 다녀와서 내가 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){
}

 

매개변수의 타입과 개수, 순서가 똑같은 경우 매개변수 이름이 다르다고 해서 이것을 메서드 오버로딩이라고 하지 않는다.

리턴 타입만 다르고 매개 변수가 동일하다면 이것도 오버로딩이 아니다.

728x90
반응형