본문 바로가기
Back-End/Java

클래스 - 01

by newny 2022. 12. 11.
반응형

객체지향 프로그래밍

부품에 해당하는 객체들을 먼저 만들고, 이 객체들을 하나씩 조립해서 완성된 프로그램을 만드는 기법

 

객체

  • 모든 인스턴스를 대표하는 포괄적인 의미
  • 클래스의 타입으로 선언되었을 때 객체라고 부름
  • 메모리 할당 되지 않은 상태
  • 객체 : 필드(속성), 메소드(동작) 으로 구성
  • 객체 모델링 : 현실 세계의 객체를 소프트웨어 객체로 설계하는 것

 

객체 간의 관계 (집합 관계, 사용 관계, 상속 관계)

 

 

객체지향 프로그래밍의 특징

  • 캡슐화 : 필드와 메소드 보호, 접근 제한자 사용
  • 상속 : 코드의 재사용성, 유지 보수 시간 최소화 (부모 객체의 필드와 메소드를 수정하면 자식 객체들은 자동으로 수정됨)
  • 다형성 : 자동 타입 변환과 재정의, 상속, 인터페이스 구현

 

객체와 클래스

  • 클래스 : 객체 생성의 설계도
  • 인스턴스
    • 클래스로부터 생성된 객체 
    • 메모리에 할당됨
    • 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부름

 

객체 생성과 클래스 변수

  • 객체 생성 → new 연산자 사용
  • new 연산자로 생성된 객체는 메모리힙(heap) 영역에 생성
  • 스택 영역에 생성된 클래스 변수가 힙 영역에 생성된 객체의 주소를 참조
/* 클래스 */
public class Animal {
  ...
}
/* 객체와 인스턴스 */
public class Main {
  public static void main(String[] args) {
    Animal cat, dog; // '객체'

    // 인스턴스화
    cat = new Animal(); // cat은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
    dog = new Animal(); // dog은 Animal 클래스의 '인스턴스'(객체를 메모리에 할당)
  }
}
클래스의 두 가지 용도
  • 라이브러리 클래스 : 다른 클래스에서 이용할 목적으로 설계
  • 실행 클래스 : main() 메소드를 제공하는 역할, 프로그램 전체에서 하나밖에없음

 

클래스의 구성 멤버

  • 필드(Field) : 객체의 데이터 저장
  • 생성자(Constructor) : 객체 생성 시 초기화 담당
  • 메소드(Method) : 객체의 동작으로 호출 시 실행하는 블록

 

 

필드

객체의 데이터를 저장하는곳 → 객체가 만들어졌을때 항상 그 객체안에 존재

  • 필드는 초기값을 주지 않아도 선언 할 수 있음 → 자동으로 기본 초기값이 적용됨
    • 정수, 실수타입 → 0
    • 논리타입 → false
    • 참조타입 → null

 

필드 사용

  • 클래스 내부에서는 단순히 필드 이름을 읽고 변경하면되지만, 클래스 외부에서 사용할 경우 우선적으로 클래스로부터 객체를 생성한 뒤 필드를 사용해야함
public class CarExample {
  public static void main(String[] arg) {
    //객체생성
    Car myCar = new Car(); //Car라는 클래스 타입의 변수 myCar선언, new 연산자로 Car();라는 객체 생성

    //필드값 읽기
    System.out.println("제작회사:" + myCar.company);
    System.out.println("모델명:" + myCar.model);
    System.out.println("색상:" + myCar.color);
    System.out.println("최고속도:" + myCar.maxSpeed);
    System.out.println("현재속도:" + myCar.speed);

    //필드값 변경
    myCar.speed = 60;
    System.out.println("수정된 속도:" + myCar.speed);

  }
}

 

 

생성자 선언과 호출

  • 생성자 : new연산자로 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당
  • 모든 클래스에는 생성자가 반드시 존재, 생성자를 하나 이상 가질 수 있음
  • 클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본생성자를 바이트 코드에 자동 추가함
  • 클래스에 명시적으로 선언한 생성자가 1개라도 있으면 컴파일러는 기본 생성자를 추가하지 않음

 

생성자 선언

  • 매개변수 선언은 생략할 수도 있고 여러개를 선언할 수도 있음
  • 클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야만 함
public class Car {
	//생성자
	Car(String model, String color, int maxSpeed) {...}
}

 

필드 초기화

  • 객체마다 동일한 값을 갖고 있다면 필드 선언 시 초기값을 대입하는 것이 좋음
  • 객체마다 다른 값을 가져야 한다면 생성자에서 필드르 초기화 하는 것이 좋음

 

생성자 오버로딩

  • 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
  • 매개 변수의 타입, 개수, 순서가 다르게 선언
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("그랜저","흰색");
Car car4 = new Car("그랜저","흰색",300);

 

다른 생성자 호출 : this()

  • this()는 자신의 다른 생성자를 호출하는 코드, 반드시 생성자의 첫줄에서만 허용
Car(String model) {
	this (model,"은색", 250); // 공통 실행코드 호출
/*
	this.model = model;
	this.color = "은색";
	this.maxSpeed = 250;
*/
}

Car(String model, String color) {
	this (model,color,250); // 공통 실행코드 호출
/*
	this.model = model;
	this.color = color;
	this.maxSpeed = 250;
*/
}

Car(String model, String color, int maxSpeed) { //공통 실행코드 작성
	this.model = model;
	this.color = color;
	this.maxSpeed = maxSpeed;
}

 

 

메소드 선언

선언부, 실행블록으로 구성

  • 리턴 타입 : 메소드가 리턴하는 결과값의 타입 표시, 리턴값이 없을경우 void로 기술함
  • 메소드 이름 : 메소드 기능이 드러나도록 이름을 지어줘야함 (소문자로 시작, 캐멀 스타일로 작성)
  • 매개 변수 선언 : 메소드를 실행 할 때 필요한 데이터를 받기 위한 변수를 선언 (없거나 하나이상)
  • 메소드 실행 블록 : 실행할 코드 작성

 

메소드 호출

  • 객체 내부에서 호출 : 메소드 이름만으로도 호출가능
public class ClassName {
    void method1(String p1, int p2) {}
    
    void method2 {
        method1("홍길동", 100);
    }
}
  • 객체 외부에서 호출 : 객체 생성 후 도트 연산자(.)를 통해 메소드 호출
Car myCar = new Car();
myCar.keyTurnOn(); //리턴값이 없음
myCar.run; //리턴값이 없음
int speed = myCar.getSpeed(); //리턴값이 int

 

가변길이 매개변수

  • 매개변수를 배열타입으로 선언 → int[] 배열객체 변수명, int… 배열객체 변수명

 

리턴(return)문

  • 리턴값이 있는 메소드 : 메소드 선언에 리턴 타입이 있는 메소드는 반드시 리턴문을 사용해서 리턴값을 지정해야함, 리턴문이 없을경우 컴파일에러 발생, 리턴문이 실행되면 메소드는 즉시 종료
int plus(int x, int y) {
	int result = x + y;
	return result;
}
  • 리턴값이 없는 메소드 : void타입 메소드에 리턴문 사용시 메소드 실행을 강제 종료시킴
void run() {
  while(true) {
    if(gas > 0) {
      System.out.println("달립니다.");
    } else {
      System.out.println("멈춥니다.");
      return; // run()메소드 종료
//while문만 종료해야할 경우엔 break; 사용
    }
  }
}

 

메소드 오버로딩

  • 매개변수의 타입, 개수, 순서 중 하나가 달라야함
  • println() 메소드 (메소드 오버로딩의 가장 대표적인 예) : 주어진 매개값의 타입에 따라서 오버로딩된 메소드중 하나를 호출함
void println() {...}
void println(boolean x) {...}
void println(char x) {...}
void println(char[] x) {...}
void println(double x) {...}
void println(float x) {...}
void println(int x) {...}
void println(long x) {...}
void println(Object x) {...}
void println(String x) {...}

 

 

반응형

'Back-End > Java' 카테고리의 다른 글

클래스 - 02  (0) 2022.12.16
참조 타입  (0) 2022.12.09
조건문과 반복문  (0) 2022.12.08

댓글