JAVA 4주차

ndy·2022년 9월 26일

Java

목록 보기
4/10

객체와 클래스

현실세계 : 설계도 -> 객체 생성 ex) 건물
자바 : 클래스 -> 객체 생성

클래스에는 객체를 생성하기 위한 필드메소드가 정의되어 있음
클래스로부터 만들어진 객체를 해당 클래스의 인스턴스라고 함
하나의 클래스로 여러개의 인스턴스생성 가능


클래스 선언

  • 한글 이름 가능하지만 영어로 작성
  • 알파벳 대소문자 다른 문자로 구분 됨

클래스 생성 과정

public class 클래스이름 {}
// -> 저장 -> 컴파일(javac.exe) -> 클래스이름.class 생성됨
  • 소스 파일 하나에 여러개의 클래스 생성 가능
  • 소스 파일 이름과 동일한 클래스public으로 선언 가능
  • 선언한 개수만큼 바이트 코드 파일[ 클래스이름.class ]이 생성됨

new 연산자

  • 객체를 생성하는 역할
new 클래스();
  • 클래스()는 생성자를 호출하는 코드
  • 생성된 객체는 힙(heap)메모리 영역에 생성
  • new 연산자는 객체를 생성한 후, 객체 생성 번지를 리턴함

클래스 변수

  • new 연산자에 의해 리턴된 객체의 번지를 저장하는 변수(참조 타입 변수)
  • 힙 영역의 객체를 사용하기 위한 변수
public class Example{
	A num1 = new A();
}
class A{
	A(){...}
} // 클래스 선언

클래스 변수 num1 : 스택(stack) 영역에 존재
클래스 객체 new A() : 힙(heap) 영역에 존재


클래스의 용도

  • 라이브러리(API: Application Program Interface) 용
    • 자체적으로 실행 x, 다른 클래스에서 사용할 목적으로 만든 클래스
  • 실행용
    • main() 메소드를 가지고 있는 클래스로 실행할 목적으로 만든 클래스

1개의 어플리케이션 = 1개의 실행클래스 + n개의 라이브러리 클래스


클래스의 구성 멤버


필드의 내용

  • 객체의 고유 데이터
  • 객체가 가져야할 부품 객체
  • 객체의 현재 상태 데이터

필드 사용

  • 필드값을 읽고, 변경하는 작업을 말함
  • 필드 사용 위치
    • 객체 내부 : 필드이름name으로 바로 접근

    • 객체 외부 : 변수.필드이름myCar.name으로 접근

      class Car{
      	String name;
          
          Car(){ name = "A1"} // 객체 내부
      } // 클래스 선언
      
      Car myCar = new Car(); // 클래스 변수, 클래스 객체 생성
      myCar.name = "B1"; // 객체 외부

생성자

  • new 연산자에 의해 호출되어 객체의 초기화를 담당

    	new 클래스();

기본 생성자

  • 모든 클래스는 생성자가 반드시 존재하고 하나 이상을 가질 수 있음
  • 생성자 선언을 생략하면 컴파일러는 자동으로 기본생성자를 추가

생성자 선언

  • 디폴트 생성자 대신 직접 선언
public class Car{
	Car(String model, String color, int maxSpeed){...}
}

Car myCar = new Car("그랜저", "black", 300);
  • 개발자가 생성자 선언시 컴파일러는 기본생성자를 만들지 않음

필드 초기화

  • 초기값 없이 선언된 필드는 객체가 생성될 때 기본값으로 자동 설정
// 클래스 생성
public class Korean {
	// 필드 선언
    String nation = "대한민국";
    String name; 	// null
    String ssn;		// null
    
    // 생성자 선언
    public Korean(String name, String ssn){
    	this.name = name;
        this.ssn = ssn;
    }
}

// 클래스 객체 생성
Korean k1 = new Korean("자바", "123456-1234567");

생성자를 다양화해야 하는 이유

  • 객체를 생성할 때 외부의 값으로 객체를 초기화할 필요가 있음
  • 외부의 값이 어떤 타입으로 몇 개가 제공될 지 모름, 생성자가 여러개 필요함

생성자 오버로딩

  • 매개변수의 타입, 개수, 순서가 다른 생성자를 여러 개 선언
public class Car {
	Car(){...}
    Car(String model){...}
    Car(String model, String color){...}
    Car(String model, String color, int maxSpeed){...}
}

Car Car1 = new Car();
Car Car2 = new Car("그랜저");
Car Car3 = new Car("그랜저", "black");
Car Car4 = new Car("그랜저", "black", 300);

다른 생성자 호출( this() )

  • 생성자가 오버로딩되면 생성자 간의 중복된 코드가 발생 가능
Car(String model) {
	this.model = model; // model 대입
    this.color = "은색";
   	this.maxSpeed = 250;
}
Car(String model, String color) {
	this.model = model;	// model 대입
    this.color = color;	// color 대입
   	this.maxSpeed = 250;
}
Car(String model, String color, int maxSpeed) {
	this.model = model;	// model 대입
    this.color = color;	// color 대입
   	this.maxSpeed = maxSpeed; // maxSpeed 대입
}

중복 해결 방법

  • 초기화 내용을 한 생성자에 몰아서 작성
Car(String model) {
	this(model, null, 0);	// 3번째 생성자 호출
}
Car(String model, String color) {
	this(model, color, 0);	// 3번째 생성자 호출
}
Car(String model, String color, int maxSpeed) {
	this.model = model;
    this.color = color;
    this.maxSpeed = maxSpeed;
}

메소드

  • 객체의 동작(기능)을 말하며 호출해서 실행 가능한 중괄호{}를 말함

리턴 타입

  • 메소드는 리턴값이 있을 수도 있고 없을 수도 있음
void powerOn{...} // 리턴값 없음
double divide(int x, int y){...} // double형을 리턴

// 메소드 호출
powerOn();
double result = divide(10, 20);

메소드 이름

  • 숫자로 시작 x, $_를 제외한 특수문자 사용 x
  • 관례적으로 메소드명은 소문자로 시작

매개변수 선언

  • 매개변수는 메소드가 실행될 때 필요한 데이터를 외부로부터 받기 위해 사용
double divide(int x, int y){...} // 메소드

double result = divide(10, 20);

매개변수의 수를 모를 경우

int sum(int[] values){...} // 메소드 방법 1

int[] num = {1, 2, 3}
int result = sum(num);

int result = sum(new int[] {1, 2, 3});
int sum(int ... values){...} // 메소드 방법 2

int[] num = {1, 2, 3}
int result = sum(num);

int result = sum(new int[] {1, 2, 3});

리턴(return)문

  • 메소드의 실행을 중지하고 리턴값을 지정
int plus(int x, int y){
	int result = x + y;
    
    return result;
}
  • 리턴값이 없는 메소드(void)
void run(){
	return; // break;와 같음
}

메소드 호출

  • 메소드는 클래스 내,외부의 호출에 의해 실행됨

객체 내부에서 호출

  • 리턴값이 있는 메소드 호출
public class ClassName {
	int method1(int x, int y){
    	int result = x + y;
        return result;
    }
    
    void method2(){
    	int result1 = method1(10, 20);		//30 저장
        double result2 = method1(10, 20);	//30.0 저장
    }
}

객체 외부에서 호출

  • 클래스로부터 객체를 생성하고 클래스 변수가 참조하도록 함

Car.java

public class Car {
	int speed;
    
    int getSpeed(){
    	return speed;
    }
    
    void keyTurnOn(){
    	System.out.println("키를 돌립니다");
    }
}

CarExample.java

Car myCar = new Car();
myCar.keyTurnOn();
myCar.run();
int speed = myCar.getSpeed();

메소드 오버로딩

  • 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것을 말함
  • 하나의 메소드 이름으로 다양한 매개값을 받기 위함

오버로딩의 조건 : 매개변수의 타입, 개수, 순서가 달라야 함

int plus(int x, int y){
	int result = x + y;
    return result;
}

int plus(double x, double y){
	int result = x + y;
    return result;
}
int x = 10;
double y = 20.3;
plus(x, y); // int 타입인 x가 double로 자동 형 변환

// plus(double x, double y)가 실행 됨

0개의 댓글