[java] 클래스와 객체, 생성자

이동엽·2022년 12월 28일
0

클래스와 객체

클래스는 객체를 정의한 설계도 또는 틀이라 정의할수 있다.
-> 클래스는 객체를 생성하는데 사용되고, 객체는 클래스에 정의되고 설계돤 내용 그대로 생성된다.
-> 클래스는 객체 그 자체가 아니라 단지 객체를 생성하는 데 사용 되는 하나의 틀.

객체

  • 구성 요소 :속성과 기능. -> 속성과 기능은 각각 필드와 메소드로 정의. ->객체의 멤버라고 부름
    하나의 객체는 다양한 속성과 기능의 집합으로 이루어져 있음.
class CarTest {
	public static void main(String[] args) {

	Car bmw = new Car(); // Car 클래스를 기반으로 생성된 bmw 인스턴스
	Car tesla = new Car(); // Car 클래스를 기반으로 생성된 tesla 인스턴스
	Car audi = new Car(); // Car 클래스를 기반으로 생성된 audi 인스턴스
}

객체의 생성,활용

클래스명 참조_변수명; // 인스턴스를 참조하기 위한 참조변수 선언
참조_변수명 = new 생성자(); // 인스턴스 생성 후, 객체의 주소를 참조 변수에 저장
//간편하게 줄여서
클래스명 참조_변수명 = new 생성자();

특정 클래스 타입의 참조변수를 선언합니다.
참조변수가 선업되면, 인스턴스를 생성해서 참조 변수에 할당.
->참조변수는 힙 메모리의 주소값을 가리킵니다.
new 키워드는 생성된 객체를 힙 메모리에 넣으라는 의미.

  • 참조 변수는 앞서 설명한대로 실제 데이터 값을 저장하는 것이 아니라 실제 데이터가 위치해있는 힙 메모리의 주소를 저장하는 변수를 의미한다.
  • new와 생성자를 통해 클래스의 객체를 생성한다는 것은 해당 객체를 힙 메모리에 넣고 그 주소값을 참조 변수에 저장한다.는것과 같다.
Person p = new Person();

클래스 Person 과 참조 변수 p 는 각각 클래스 영역과 스택 영역이라는 다른 위치에 저장된다.
-> 인스턴트 : 힙 메모리 영역에 들어가며 객체 내부에는 클래스의 멤버들이 위치
-> 참조변수는 객체의 실제 값이 아닌 힙에 저장되어 있는 주소값가리킨다.

메소드 구현 코드는 클래스 영역에 저장되고 객체 안에서는 그 위치를 가리킨다.
같은 클래스로 만든 모든 객체는 동일한 메소드 값을 공유하기 때문에 여러 번 같은 메소드를 선언해주는 게 아니라, 한번만 저장하고 필요할때 클래스 영역에 정의된 메소드를 찾아 사용할 수 있다.
->생성된 객체에서 필드값은 실제 저장공간이 객체 내부에 있다는 것과 메서드는 다른 영역에 하나만 저장해놓고 공유한다

인스턴스,객체의 차이

인스턴스 : 클래스를 통해 생성된 객체.
-> 인스턴스화 :클래스로부터 객체를 만드는 과정

  • 같은 말이라 차이를 두는 것에 큰 의미 없지만,
  • 좀더 자세히 구분해보면
    객체는 모든 인스턴스를 포관하는 넓은 의미,
    인스턴스는 해당 객체가 어떤 클래스로부터 생성된 것인지를 강조.

클래스의 구성요소와 기본 문법

class 클래스명{ //클래스 정의
	~~~
}
// 구성 요소는 필드,메소드,생성자,이너 클래스
  • 필드 : 클래스의 속성을 나타내는 변수
  • 메소드 : 클래스의 기능을 나타내는 함수
  • 생성자 : 클래스의 객체를 생성하는 역할
  • 이너 클래스 : 클래스 내부의 클래스

필드와 메소드는 각각의 클래스가 가지는 속성와 기능을 대표한다.
속성과 기능은 해당 클래스와 관련된 데이터의 집합.

필드

자바에서 변수는 크게 클래스 변수, 인스턴스 변수, 지역 변수.
클래스,인스턴스 변수는 static키워드 유무로 구분한다.
static 유 : 클래스 변수, static 무 : 인스턴스 변수.

class Example { // => 클래스 영역
	int instanceVariable; // 인스턴스 변수
	static int classVariable; // 클래스 변수(static 변수, 공유변수)

	void method() { // => 메서드 영역
		int localVariable = 0; // 지역 변수. {}블록 안에서만 유효
	}
}

인스턴스 변수는 인스턴스가 가지는 각각의 고유한 속성을 저장하기 위한 변수로 new생성자()를 통해 인스턴스가 생성될 때 만들어 진다.
클래스 변수는 독립적인 저장 공간을 가지는 인스턴스 변수와 다르게 공통된 저장공간을 공유한다.
-> 인스턴스 변수와 달리 인스턴스를 따로 생성하지 않고도 언제라도 클래스명.클래스변수명을 통해 사용이 가능합니다.

지역변수는 메소드 내에 선언되며 메소드 내{}에서만 사용가능한 변수이다.
멤버 변수와는 다르게 지역변수는 스택 메모리에 저장되어 메서드가 종료되는 것과 동시에 함께 소멸되어 더이상 사용할 수 없게 됩니다.

필드 변수와 지역 변수의 주요한 한 가지 차이점은 초기값에 있습니다.
메모리의 저장 위치와 긴밀한 연관성을 가집니다. 힙 메모리에는 빈 공간이 저장될 수 없기 때문에 이곳에 저장되는 필드는 강제로 초기화되지만, 스택 메모리는 강제로 초기화되지 않으므로 지역 변수는 선언시 반드시 초기화를 실행해주어야 합니다.

static 키워드

  • 정적 멤버. ->바로 클래스 명으로 변수나 메소드 호출이 가능하다.
  • static 키워드로 정의되어 있는 클래스 멤버들은 인스턴스의 생성 없이도 클래스명.멤버명 만으로도 사용이 가능하다.-> 모든 인스턴스에 공통적으로 적용되는 값을 공유할 수 있다.

  • static 키워드를 사용하는 정적 멤버를 클래스명.멤버명 으로 사용할 수 있는 것 또한 앞에서 봤었던 메모리의 저장 위치와 관련이 있다.

  • new 키워드를 통해 생성된 인스턴스는 힙 메모리에 생성되고 독립적인 저장공간을 가지게 됩니다.

  • 정적 필드는 객체 간 공유 변수의 성질이 있다는 점입니다.

  • 정적 메소드는 인스턴스 변수 또는 인스턴스 메소드를 사용할 수 없다.

메소드

-특정 작업을 수행하는 일련의 명령문들의 집합.

제어자 반환타입 메소드명(매개 변수){
	명령어
}
  • 리턴할때 반드시 반환타입과 일치하거나 적어도 자동 형변환이 가능해야 한다.
  • 클래스 내부에 있는 메서드끼리는 따로 객체를 생성하지 않고도 서로를 호출할 수 있습니다.

메소드 오버로딩

  • 매서드 오버로딩이란 하나의 클래스 안에 같은 이름의 메서드를 여러 개 정의하는 것을 의미합니다.
  • 조건 :
  • 메소드의 이름이 같음
  • 매개변수의 개수 또는 타입이 달라야 한다.
  • 장점 : 메소드 하나로 여러 경우의수를 해결한다.

생성자

-객체를 생성하는 역할을 하는 클래스의 구성 요소
인스턴스가 생성될 때 호출되는 인스턴스 초기화 매소드이다
!! 오해 : 인스턴스 생성은 new 키워드이고 생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메소드이다.,
-조건 :

  • 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
  • 생성자는 리턴 타입이 없다.
    생성자 예제 1,2
public class CarTest {
    public static void  main(String[] args){
        gogo go1 = new gogo();
        gogo go2 = new gogo("Hello World");
        gogo go3 = new gogo(5,10);
    }
}
class gogo{
    public gogo() {
        System.out.println("1번");
    }
    public gogo(String str){
        System.out.println("2번");
    }
    public gogo(int a, int b){
        System.out.println("3번");
    }
}
class Car {
    public String model;
    public String color;

    public Car(){} // 기본생성자. 생성자가 없는 경우 자동 생성

		// 생성자 오버로딩
    public Car(String model, String color) { // 매개변수가 있는 생성자
        this.model = model;
        this.color = color;
    }

    void power() {
        System.out.println("시동을 걸었습니다.");
    }

    void accelerate() {
        System.out.println("더 빠르게!");
    }

    void stop(){
        System.out.println("멈춤");
    }
}

기본 생성자

  • 매개변수 없는 생성자
클래스명(){}

Defence(){} // Defence 클래스의 기본 생성자.

만약에 생성자가 이미 추가되어있는 경우는 이미 추가되어 있는 생성자를 기본으로 사용한다.

매개변수 있는 생성자

  • 메서드처럼 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는 데 사용된다.
    각각 인스턴스 마다 다른 값을 초기화할때 쓴다.
public class CarTest {
    public static void  main(String[] args){
        Person Kang = new Person();//비어있는 객체
        Person Kim = new Person("똥깡",25,166);
    }
}
class Person {
    String name;
    int age;
    double height;

    public Person() {
    }

    public Person(String name, int age, double height) {
        this.name = name;
        this.age = age;
        this.height = height;
    }
}

this,this()

this()

메소드의 호출 내용에서 같은 클래스 안에 메소드들끼리 서로 호출하는것 처럼 생성자도 서로 호출할수 있다.
->자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용.
-조건

  • this() 메소드는 반드시 생성자의 내부에서만 사용가능
  • this() 메소드는 반드시 생성자의 첫 줄에 위치 해야한다.
class Car{
	String color; // 인스턴스 변수
    String Type;
    int door; 
    
    Car(){//그냥 디폴트값
        this("white", "auto", 4); // Car(String color, string Type, int door)를 호출
    }
    
    Car(String color){//color만 오면
        this(color, "auto", 4);
    }
    
    Car(String color, String Type, int door){
        this.color = color; 
        this.gearType = gearType;
        this.door = door;
    }
}

car()생성자,car(String color)생성자는 this()를 통해 모두 Car(String color,String Type,int door)생성자를 호출하는 것이다.

this 키워드

-인스턴스 자신을 가르키는 참조 변수, 이걸 통해 인스턴스 자기의 멤버에 접근할수 있다.
* static 메소드에서는 this를 사용하지 못한다.
why? : 인스턴스 변수와 매개변수가 같을때 구분해주기 위해 사용한다.

class Car {
    String color; // 인스턴스 변수
    String gearType;
    int door; 
    
    Car(String color, String gearType, int door){
        this.color = color; //this.clolor는 인스턴스 변수, color는 매개변수
        this.gearType = gearType;
        this.door = door;
    }
}

참고

https://lowelllll.github.io/java/2018/12/09/java-this-%EC%B0%A8%EC%9D%B4%EC%A0%90/

코드스테이츠
profile
씨앗

0개의 댓글