본문 바로가기

Programming/JAVA

자바의 클래스

1. 객체 지향 프로그래밍 (OOP : Object Oriented Programming)

: 모든 데이터를 객체(object)로 취급하며, 하나씩 조립해서 완성된 프로그램을 만드는 기법

 

-객체(Object)

: 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것을 말한다.

 

객체 모델링(Object Modeling) : 현실 세계의 객체를 소프트웨어 객체로 설계하는 것

예를 들어 사람의 속성으로는 이름, 나이가 있고 동작으로는 웃다, 먹다, 걷다 등의 동작이 있는데 이 속성과 동작들을 각각 필드(field)메소드(method)라고 부른다.

 

 

※ 객체 지향 프로그램의 특징

: 캡슐화, 상속, 다형성

 

 

-캡슐화(Encapsulation)

: 객체의 필드, 메소드를 하나로 묶고, 실제 구현 내용을 감추는 것으로 외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노출해서 제공하는 필드와 메소드만 이용할 수 있다.

-> 접근 제한자(Access Modifier)를 사용하여 캡슐화된 멤버를 노출시킬 것인지, 숨길 것인지를 결정한다.

 

 

-상속(Inheritance)

: 객체 지향 프로그래밍에는 부모 역할의 상위 객체와 자식 역할의 하위 객체가 있다. 상위 객체는 자기가 가지고 있는 필드와 메소드를 하위 객체에게 물려주어 하위 객체가 사용할 수 있도록 해주는 것을 상속이라 한다.

-> 자식 객체 즉, 하위 객체가 상위 객체를 상속 받았다면 상위 객체 수정으로 모든 하위 객체들의 수정 효과를 가져오므로 유지 보수 시간을 최소화시켜주기도 한다.

 

-다형성(Polymorphism)

: 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질을 다형성이라 한다.

 

 

2. 클래스

: 객체를 정의하는 틀 또는 설계도와 같은 의미로 사용된다. 클래스에는 객체를 생성하기 위한 필드 메소드가 정의되어 있으며 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 한다.

 

/* 클래스의 구성 멤버 */
public class ClassName {
	
    // 필드
    int fieldName;
    
    // 생성자
    ClassName() {
    	/* .... */
    }
    
    // 메소드
    void methodName() {
    	/* .... */
    }
}

 

-필드(field)

: 객체의 데이터(고유 데이터, 부품 객체, 상태 정보)가 저장되는 곳으로 생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재한다.

※선언 형태는 변수(variable)와 비슷하지만 변수라고는 부르지 않는다.

 

/* Car 클래스 필드 선언 */
public class Car {
	// 필드
	String company = "현대";
	String model = "그랜저";
	String color = "검정";
	int maxSpeed = 350;
	int speed;
}
/* 외부 클래스에서 Car 필드값 읽기와 변경 */
public classs CarExample {
	public static void main(String[] args) {
          // 객체 생성
          Car myCar = new Car();

          // 필드값 읽기
          System.out.println("제작회사: " + myCar.company);	// 제작회사: 현대자동차 출력
          System.out.println("최고속도: " + myCar.maxSpeed);	// 최고속도: 350 출력

          // 필드값 변경
          myCar.speed = 60;
    }
}

 

-생성자(constructor)

: new 연산자로 호출되는 특별한 중괄호 {} 블록으로 객체 생성 시 초기화를 담당한다.

/* 생성자 선언 */
public class Car {
	// 생성자
    Car(String color, int cc) {
    }
}
/* 생성자 호출 후 객체 생성 */
public class CarExample {
	public static void main(String[] args) {
          Car myCar = new Car("검정", 3000);
          // Car myCar = new Car();	-> 기본 생성자 호출 불가
    }
}

 

※생성자 오버로딩(Overloading)

: 매개 변수를 달리하는 생성자를 여러개 선언하는 것

public class Car {
	Car(String model) { ... }  
	Car(String model, String color) { ... }
	Car(String color, String model) { ... }		// 위의 생성자와 오버로딩이 아님
   
}

-> 생성자의 이름은 같으나 매개 변수의 타입, 개수, 순서가 다르게 선언하면 오버로딩이라고 하지만 매개 변수의 타입과 개수, 선언된 순서가 같을 때 매개 변수 이름만 바꾸는 것은 오버로딩이라고 할 수 없다.

 

-this()

: 자신의 다른 생성자를 호출하는 코드로 생성자 내부에서만 사용할 수 있으며, this()의 매개값은 호출되는 생성자의 매개 변수 타입에 맞게 제공해야 한다.

 

 

-메소드(method)

: 객체의 동작에 해당하는 중괄호 {} 블록으로, 메소드를 호출하게 되면 중괄호 블록에 있는 모든 코드들이 일괄적으로 실행된다.

 

-메소드 선언

: 선언부(리턴타입, 메소드이름, 매개변수선언)와 실행 블록으로 구성된다.

더보기

리턴타입 메소드 이름 ( [매개변수선언, ...] ) {

                        실행할 코드를 작성하는 곳

}

 

*리턴타입

: 메소드가 실행 후 리턴하는 값의 타입을 말하며 리턴타입은 있을 수도 있고 없을 수도 있다. 메소드가 실행 후 결과를 호출한곳에 넘겨줄 경우에는 리턴값이 있어야 한다.

void powerOn() { ... }		// 리턴값이 없는 메소드
double divide(int x, int y) { ... }	// 리턴값이 있는 메소드

/* 메소드 호출 */
powerOn();
double result = divide(10, 20);		// 리턴값을 변수에 저장하는 호출 방법
divide(10, 20);		// 변수 선언 없이 메소드 호출 방법

int result = divide(10, 20);		// 컴파일 에러

 

※메소드 오버로딩(Overloading)

: 클래스 내에 같은 이름의 메소드를 여러 개 선언하는 것

public class Calculator {
    // 정사각형 넓이 
    double areaRectangle(double width) {
    return width * width;
    }
    
    // 직사각형 넓이
    double areaRectangle(double width, double height) {
    return width * height;
    }
}
  1. 메소드의 이름은 같아야 한다.
  2. 메소드의 시그니처, 즉 매개변수의 개수 또는 타입이 달라야 한다.

-> 두 가지 조건을 만족해야 한다.

 

-this 참조 변수

: 인스턴스(instance)가 자기 자신을 참조하는데 사용하는 변수이며, this 참조 변수는 해당 인스턴스의 주소를 가리킨다.

 

-final 필드

: 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없다.

final필드는 객체마다 저장되고, 생성자의 매개값을 통해 여러 가지 값을 가질 수 있다.

final String nation = "Korea";

*final 필드의 초기값을 줄 수 있는 방법

  1. 필드 선언 시에 주는 방법
  2. 생성자에서 주는 방법

-상수(static final)

: 객체마다 저장되지 않고, 클래스에만 포함된다. 떠한 초기값이 한 번 저장되면 변경할 수 없다.

static final double PI = 3.14159;