자바(Java) - 클래스와 객체 1

Dec 28, 2023
자바(Java) - 클래스와 객체 1

객체 지향 프로그래밍이란?

객체

💡
객체(object)는 그 이름에서 볼 수 있듯이, 객체 지향 기술의 핵심 개념이다.
 

객체는 상태와 동작을 가지고 있다.

 
  • 객체의 상태(state)는 객체의 속성이다.
    • 예를 들어, 텔레비전 객체의 경우, 채널 번호, 볼륨, 전원 상태 등이 상태에 해당된다.
 
  • 객체의 동작(behavior)은 객체가 취할 수 있는 동작(기능, 행동)이다.
    • 텔레비전을 예로 들면, 켜기, 끄기, 채널 변경하기, 볼륨 변경하기 등이 동작에 해당된다.

 
 

객체 지향 프로그래밍

💡
객체 지향 프로그래밍은 데이터함수하나의 덩어리로 묶어서 생각하는 방법이다.
 
데이터와 함수를 하나의 덩어리(객체)로 묶는 것을 캡슐화라고 부른다.

 
 

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

💡
역사적으로 객체 지향 언어는 캡슐화, 상속, 다형성추상화로 정의된다.
 
따라서 언어가 이 모든 것을 지원하지 않으면, 완전히 객체 지향적인 것으로 간주되지 않는다.

 
 

상속

💡
상속이란 이미 작성된 클래스(부모 클래스)를 이어받아서 새로운 클래스(자식 클래스)를 생성하는 것을 말한다.
 
  • 부모 클래스를 이용하여 공통적인 속성과 동작을 정의한다.
 
  • 자식 클래스부모 클래스의 모든 속성과 동작을 물려받는다.

 
 

다형성

💡
다형성이란, 동일한 이름의 동작이라고 하여도 객체의 실제 타입에 따라서 동작의 내용이 달라질 수 있다는 것을 의미한다.
 

다형성을 사용하게 되면 개념적으로 동일한 작업을 하는 메소드에 똑같은 이름을 부여할 수 있으므로 코드가 더 간단해진다.


 
 

추상화

💡
불필요한 정보는 숨기고 중요한 정보만을 표현함으로써 프로그램을 간단히 만드는 기법이다.

클래스와 객체 만들기

클래스란?

💡
객체에 대한 설계도클래스(class)라고 한다.
 
 

클래스 작성

💡
클래스객체의 형태를 정의하는 틀(template)과 같은 것이다.
 
클래스변수함수를 동시에 가지고 있다.
 

클래스는 다음과 같은 구조를 이용하여서 정의된다.

public class 클래스이름 { 자료형 필드1; 자료형 필드2; ... // 필드 반환형 메소드1() { ... } 반환형 메소드2() { ... } ... // 메소드
 
 

참조 변수

💡
자바에서는 변수기초 변수(primitive variable)와 참조 변수(reference variable)로 나눌 수 있다.
 
  • 기초 변수는 int, double, long, char 등의 기초 자료형의 값을 저장하는 변수이다.
    • 이들 기초 변수에는 실제 데이터값이 저장된다.
       
  • 참조 변수는 객체를 참조할 때 사용되는 변수이다.
    • 여기에는 객체의 참조값이 저장된다. 참조값은 일반적으로 객체의 주소이다.
      참조 변수에 객체가 직접 저장되는 것은 아니라는 것을 주의하여야 한다.
       
       

객체 생성

객체를 생성하는 첫 번째 단계 참조 변수를 선언하는 단계이다.

Circle obj;
 

두 번째 단계new 연산자를 사용하여서 객체를 생성하고 객체의 참조값참조 변수에 저장하는 단계이다.

obj = new Circle();
new 연산자는 객체를 히프 메모리(사용되지 않은 메모리)에 생성한 후에 객체의 참조값을 반환한다. 코드에서는 이 참조값을 참조 변수 obj에 저장한다.
아직 객체는 초기화되지 않았다.
 

세 번째 단계객체의 필드메소드사용하는 단계이다.

 
객체의 필드메소드에 접근할 때는 점(.) 연산자를 사용한다.
obj.radius = 100; obj.color = "blue"; double area = obj.getArea();

생성자와 메소드 오버로딩

메소드 오버로딩

💡
자바에서는 같은 이름의 메소드여러 개 존재할 수 있다. 이것을 메소드 오버로딩이라고 한다.
 
메소드 오버로딩다형성을 구현하는 한 가지 방법이 된다.
 
int add(int x, int y) { return x + y; } int add(int x, int y, int z) { return x + y + z; } // 매게 변수만 다르면 메소드 이름은 같아도 된다. 이것을 메소드 중복정의라고 한다.
 
 

생성자

객체는 어떻게 초기화하면 좋을까?
객체가 생성된 후에 객체 멤버에 값을 대입하여도 된다.
하지만 이러한 방법은 많은 단점을 가지고 있다.
 
💡
생성자는 객체가 생성될 때 객체를 초기화하는 특수한 메소드이다.
 
생성자의 이름클래스의 이름과 같다.
일반 메소드와 아주 흡사하지만 반환값을 가지지 않는다.
 
class Pizza { int size; String type; public Pizza() { size = 12; type = "슈퍼슈프림"; } // 매개 변수가 없는 생성자 public Pizza(int s, String t) { size = s; type = t; } // 매개 변수가 있는 생성자 }
 

기본 생성자

💡
기본 생성자매개 변수가 없는 생성자이다.
 
만약 개발자가 생성자를 하나도 정의하지 않으면 자바 컴파일러는 기본 생성자를 자동으로 만든다.
 
기본 생성자에서는 자동적으로 모든 멤버 변수들을 기본값으로 초기화한다.
 
개발자가 생성자를 하나라도 선언하면, 컴파일러는 기본 생성자를 추가하지 않는다.
 
 

this 참조 변수

💡
this는 현재 객체 자신을 가리키는 참조 변수이다.
 
this는 컴파일러에서 자동으로 생성한다.
 
흔히 생성자에서 매개 변수 이름과 필드 이름이 동일한 경우에 혼동을 막기 위해서 사용한다.
 
public class Circle { int radius; public Circle(int radius) { // this.radius는 필드이고 this.radius = radius; // radius는 매개 변수라는 것을 알 수 있다. } }
 
 
 

접근 제어

💡
접근 제어란 클래스의 멤버에 접근하는 것을 제어하는 것이다.
 

자바의 접근 제어 지정자

접근 지정자
해당 클래스 안
패키지
자식 클래스
전체
public
O
O
O
O
protected
O
O
O
X
없음
O
O
X
X
private
O
X
X
X
 

접근자와 설정자

만약 클래스 안에 저장된 필드 값이 꼭 필요한 경우에는 어떻게 하면 좋을까?
이 경우에는 어떤 특수한 메소드가 있어서 이들 메소드가 데이터 값을 읽어 외부로 전달해주면 좋을 것이다.
필드와 관련된 두 가지의 종류의 메소드가 있다.
 
💡
하나는 필드값을 반환하는 접근자(getters)이고 또 하나는 필드값을 설정하는 설정자(setters)이다.
 
이러한 메소드는 대개 get이나 set메소드 이름 앞에 붙여진다.
 
예를 들면 getBalance()는 접근자이고 setBalance()는 설정자이다.
 
public class Account { // 필드가 모두 private로 선언되었다. 클래스 내부에서만 사용이 가능하다. private int regNumber; private String name; private int balance; // 접근자와 설정자를 사용하고 있다. public String getName() { return name; } public void setName(String name) { this.name = name; } public int getBalance() { return balance; } public void setBalance(int balance) { this.balance = balance; } } public class AccountTest { public static void main(String[] args) { Account obj = new Account(); obj.setName("Tom"); obj.setBalance(100000); System.out.println("이름은 " + obj.getName() + " 통장 잔고는 " + obj.getBalance() + "입니다."); } }
 
 

접근자와 설정자를 사용하는 이유

  • 접근자와 설정자를 사용해야만 나중에 클래스를 업그레이드할 때 편하다.
 
  • 접근자에서 매개 변수를 통하여 잘못된 값이 넘어오는 경우, 이를 사전에 차단할 수 있다.
 
  • 필요할 때마다 필드값을 동적으로 계산하여 반환할 수 있다.
 
  • 접근자만을 제공하면 자동적으로 읽기만 가능한 필드를 만들 수 있다.
 
 
Share article

stwin755