https://school.programmers.co.kr/learn/courses/5/lessons/137
public class CarExam{
public static void main(String args[]){
Car c1 = new Car();
Car c2 = new Car();
}
}
car 객체 생성하기
참조타입
참조형 타입은 기본형 타입을 제외한 모든 타입입니다. 앞서 배웠던, 배열도 참조형이고, 클래스도 모두 참조 타입이다
- 참조형 변수
- String str = new String("hello");
- str 변수 앞에 기본형 타입이 아닌 String클래스가 적혀있다.
- 이퀄(=)뒤에는 new 다음에 생성자라는 것이 있다.
- new 라는 키워드는 객체를 메모리에 올려준다. 이렇게 메모리에 올라간 객체를 인스턴스라고 말한다.
- String str = new String("hello");
- 메모리에 올라간 인스턴스를 가리키는 변수, 참조하는 변수, 레퍼런스 하는 변수가 str 이다. 참조한다. 레퍼런스 한다라는 것은 변수가 인스턴스를 가지고 있는게 아니라 말그대로 가리킨다는 의미이다.
- str이라는 변수에는 메모리의 위치 값이 저장되는 것이다. 메모리의 위치값이 저장된다고 하더라도, 어떤 메모리에 저장되는지 그 정보를 알 수 있는 방법은 없다. 그렇기 때문에 str변수는 String 인스턴스를 참조한다라고만 아시면 된다.
- 앞으로 배울 클래스들은 모두 참조형이다
this 의 사용
public class Car{
String name;
int number;
public Car(String n){
name = n;
}
}
- Car클래스의 생성자 매개변수의 이름이 n 이다. n 이라는 변수명은 무엇을 의미하는지 쉽기 알수 없다.
- n 으로 쓰기 보다는 name 으로 사용하는 것이 좋다.
public Car(String name){
name = name;
}
- 'name=name' 이라고 코드를 바꾸면, 가깝게 선언된 변수를 우선 사용하기 때문에 'name=name'이라는 코드는 매개변수의 name의 값을 매개변수 name에 대입하라는 의미가 된다.
- 즉, 필드는 바뀌지 않습니다. 이런 경우 필드라는 것을 컴파일러와 JVM에게 알려주기 위해서 this키워드를 사용해야 한다.
public Car(String name){
this.name = name;
}
- 앞의 this.name은 필드 name을 말하고 =(이퀄) 뒤의 name은 매개변수를 의미한다.
- 즉 매개변수의 값을 필드에 대입하라는 의미가 된다.
클래스 안에서 자기 자신이 가지고 있는 메소드를 사용할 때도 this.메소드명()으로 호출할 수 있다.
생성자 오버로딩과 this
생성자 오버로딩
생성자의 매개변수의 유형과 개수가 다르게 하여 같은 이름의 생성자를 여러 개 가질 수 있다.
- 생성자도 메소드와 마찬가지로 여러개를 선언할 수 있다.
- 매개변수의 수와 타입이 다르다면 여러개의 생성자를 선언할 수 있다.
public class Car{
String name;
int number;
public Car(){
}
public Car(String name){
this.name = name;
}
public Car(String name, int number){
this.name = name;
this.number = number;
}
}
오버로딩된 생성자 이용하기
public class CarExam4{
public static void main(String args[]){
Car c1 = new Car();
Car c2 = new Car("소방차");
Car c3 = new Car("구급차", 1234);
}
}
자기 생성자 호출하는 this()
- 기본생성자를 호출하였을 때 name을 "이름없음" , 숫자를 0으로 초기화 하기
public Car(){
this.name = "이름없음";
this.number = 0;
}
- 위처럼 작성했을 경우 코드의 중복이 일어난다.
- 자신이 가지고 있는 다른 생성자를 이용할 수 있다.
public Car(){
this("이름없음", 0);
}
- this괄호 열고로 시작하면 자신의 생성자를 호출하는 것이다.
- 자기 자신의 생성자를 호출함으로써 비슷한 코드가 중복되서 나오는 것을 방지할 수 있다.
패키지
패키지(package)란 서로 관련이 있는 클래스 또는 인터페이스들을 묶어 놓은 묶음이다. 패키지를 사용함으로써 클래스들이 필요할 때만 사용될 수 있도록 하고, 클래스를 패키지 이름과 함께 계층적인 형태로 사용함으로써 다른 그룹에 속한 클래스와 발생할 수 있는 클래스 이름간의 충돌을 막아줌으로 클래스의 관리를 편하게 해준다.
패키지 정의방법
- package이름은 보통 도메인 이름을 거꾸로 적은 후, 그 뒤에 프로젝트 이름을 붙여서 만든다. 물론, 프로젝트 이름 뒤에 또 다른 이름이 나올 수도 있다.
- package이름은 폴더명 점 폴더명 점 폴더명 과 같은 형식으로 만들어진다. 각각의 폴더명은 숫자로 시작할 수 없다.
- 도메인 이름이 8cruz.com 이고 프로젝트 이름이 javastudy 라면 com.eightcruz.javastudy.Hello 로 패키지를 지정 할 수 있다.
- 도메인이 숫자로 시작되는데 패키지명은 첫글자에 숫자를 사용할 수 없으므로 적절하게 수정한다.
- 도메인으로 사용하는 이유는 패키지가 중복되는것을 방지하기 위함이므로, 반드시 존재하는 도메인이 아니라도 상관없다.
이클립스에서 패키지 생성하기
- 소스폴더를 선택한 후 우측버튼을 클릭하여 패키지 생성을 선택한다.
- 패키지 이름에 kr.co.helloWorld.javastudy를 입력한다.
- 해당 패키지를 선택하고 Hello클래스를 작성한다.
- 작성된 클래스 파일의 첫줄에 package com.eightcruz.javastudy.Hello; 생성된것을 볼 수 있다.
- 패키지를 생성하는 예약어는 package 다.
패키지에 생성된 클래스 사용하기
- java.lang패키지를 제외하고는 다른 패키지에 있는 클래스를사용하려면 import라는 구문을 적어줘야 한다.
- import com.eightcruz.javastudy.Hello;
- 위의 코드는 com.eightcruz.javastudy패키지 아래의 Hello클래스를 사용하겠다는 것을 컴파일러와 JVM에게 알리는 것이다.
- 클래스 이름대신에 * 를 적어도 된다. import com.eightcruz.javastudy.*;
import 하지 않고 사용하는 방법
- 만약 import를 하기 싫다면, 혹은 각기 다른 패키지에 존재하는 같은 이름의 클래스 파일을 사용해야 한다면 아래와 같이 이용한다.
- com.eightcruz.javastudy.Hello hello = newe com.eightcruz.javastudy.Hello(); 이렇게 사용한다.
'-java spring notes- > 객체' 카테고리의 다른 글
프로그래머스 - 인터페이스 (0) | 2023.01.05 |
---|---|
프로그래머스 - 상속 (0) | 2023.01.05 |
객체지향의 사실과 오해- 인터페이스, 추상화 (0) | 2022.12.28 |
객체지향의 사실과 오해 (0) | 2022.12.28 |
JAVA 객체지향-클래스 인스턴스 메서드 (2) | 2022.11.29 |