본문 바로가기

Programming/JAVA

[ JAVA ] 객체 지향 1 - 객체 지향 프로그래밍

[Contents]

  1. 객체 이해하기
  2. 객체란?
  3. 객체지향 프로그래밍 특징
  4. 클래스와 인스턴스

 

# 1. 객체 이해하기

객체지향이 대두된 이유는 기존의 절차지향 패러다임에 비해 현실세계의 상호작용 구조와 흡사하기 때문입니다. 따라서 현실세계에 대입해보는 것이 가장 빠릅니다. 자신의 상황에 맞게 대입해보면 객체의 개념을 느낄 수 있습니다.

더보기
package example;
public class Person{
	// 필드(field)
	String name;
    int age;
    
    public Person(){ } // default 생성자
    
    // 생성자
	Person(String name, int age){
		this.name = name;
		this.age = age;
	}
	
	@Override
	public String toString() { // toString 메소드 오버라이딩
		return "이름 : "+name+", 나이 : "+age;
	}
}

class Student extends Person{ // Person 클래스를 상속받은 Student 클래스
	// 필드(field)
    String major;
	Student(String name, int age, String major) {
		super(name, age); // Person 클래스의 생성자를 참조함.
		this.major = major;
	}
    // 메소드(method)
	void study(String name) { 
		System.out.println(name+"를 공부하다.");
	}
	public String toString() { //toString 메소드 오버라이딩
		return "이름 : "+name+", 나이 : "+age+", 전공 : "+major;
	}
}

 

Person 클래스에는 멤버 변수 name과 age를 갖고 메소드는 따로 갖지 않습니다. 멤버 변수와 메소드를 묶는 것을 객체지향에서는 캡슐화라고 합니다. Person 클래스를 상속하는 Student 클래스는 major 변수를 추가로 갖고, study()라는 메소드를 추가로 갖습니다.

이때 String toString() 메소드는 Object의 메소드를 오버라이딩한 것으로, 객체를 정의할 때 사용하는 메소드입니다. 아래 PersonExample에서 hj.toString()을 프린트하지만 사실 toString() 을 제거해도 결과에 무방합니다. 그 이유는 객체를 프린트할 때 toString()이 생략되었기 때문입니다.

package example;

public class PersonExample {
	public static void main(String[] args) {
		Person hj1 = new Person("김희정", 23); // Person 클래스의 객체 생성
		Student hj2 = new Student("김희정", 23, "컴퓨터 공학"); // Student 클래스의 객체 생성
		
		Person hj = new Student("김희정", 23, "컴퓨터 공학"); // 상위 클래스에 하위클래스 대입:업캐스팅
		System.out.println(hj.toString());  // hj = hj.toString()
		((Student)hj).study("Java Programming"); // ((Student)hj): 다운 캐스팅 부분
		
	}
}

여기서 우리는 Person 객체에 Student 객체가 담긴 것을 확인할 수 있습니다. "김희정"이라는 이름을 가진 사람은 사람일 수도 있고, 학생일 수도 있게 되는 것인데요, 그것이 다형성이라고 할수있습니다.

이 때, Person 객체에 Stduent 객체를 담는 것을 업 캐스팅이라 합니다! 업캐스팅을 하면 Student 객체의 고유의 메소드를 사용할 수 없는데, 이때 하위(Student) 객체의 메소드를 사용하기 위해서 Student 형식으로 바꿔줘야하는데, 이것을 다운 캐스팅이라고 합니다.

자신의 상황을 적용해봄으로써 객체를 이해하면 객체지향이 어렵게 느껴지지 않을 것입니다!

 

# 2. 객체란?

  • 객체(Object)란? 물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것. 객체는 속성과 동작으로 구성된다. 자바에서는 이 속성과 동작들을 각각 필드(field)메소드(method)라고 부른다.
  • 현실세계의 객체를 소프트웨어 객체로 설계하는 것 => 객체 모델링(Object Modeling)
  • 객체 사이의 상호작용 수단은 메소드이다. 객체가 다른 객체의 기능을 이용하는 것이 바로 메소드 호출이다.
  • 객체 간의 관계에는 집합 관계, 사용 관계, 상속 관계가 있다.

 

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

객체지향 프로그래밍(OOP: Object Oriented Programming)이란? 만들고자 하는 완성품인 객체를 모델링하고, 집합 관계에 있는 부품 객체와 사용 관계에 있는 객체를 하나씩 설계한 후 조립하는 방식으로 프로그램을 개발하는 기법.

객체지향 프로그램의 특징으로는 ⑴캡슐화, ⑵상속, ⑶다형성을 들수 있다.

 

  • 캡슐화(Encapsulation)

캡슐화란? 객체의 필드, 메소드를 하나로 묶고, 실제 구현내용을 감추는 것.

외부 객체는 객체 내부의 구조를 알지 못하며 객체가 노풀해서 제공하는 필드와 메소드만 이용할 수 있다. 자바 언어는 캡슐화된 멤버를 노출시킬 것인지, 숨길 것인지를 결정하기 위해 접근 제한자(Access Modifier)를 사용한다.

cf) 접근 제어자(Access Modifier)의 종류: public, default, protected, private

접근 제어자 - private, public
접근 제어자 - default, protected

 

  • 상속(Inheritance)

상속이란? 부모가 가지고 있는 재산을 자식에게 물려주듯 클래스도 성질을 물려주는 것입니다.

class Animal { ... }
class Cat extends Animal { ... }

extends 키워드를 통해 장점: 개발 시간 단축, 유지보수 시간 최소화

상속 관계

 

  • 다형성(polymorphism)

다형성이란? 같은 타입이지만 실행 결과가 다양한 객체를 이용할 수 있는 성질. 부모 타입에는 모든 자식 객체가 대입될 수 있고, 인터페이스 타입에는 모든 구현 객체가 대입될 수 있습니다. 예를 들어 Animal 상위 객체에는 Cat 객체든 Wolf 객체든 하위 객체가 담길 수 있는 것입니다.

class AnimalTest{
    public static void main(String[] args){
        Animal animal = new Cat();
        Animal animal2 = new Wolf();
    }
}

 

# 4. 클래스와 인스턴스

  • 클래스(class)란? 자바에서 객체를 만들기 위한 설계도. 클래스에는 객체를 생성하기 위한 필드와 메소드가 정의 되어있음
  • 클래스로부터 만들어진 객체를 해당 클래스의 인스턴스(instance)라고 함.
  • 클래스 선언
public class 클래스이름 {

}

- 일반적으로 소스 파일 하나당 하나의 클래스를 선언하는 것이 원칙입니다. 하지만, 두 개 이상의 클래스 선언도 가능한데, 주의할 점은 파일 이름과 동일한 이름의 클래스 선언에만 public 접근 제한자를 붙일 수 있다고합니다.

 

  • 객체 생성과 클래스 변수 : new 연산자 사용
클래스 변수;
변수 = new 클래스();

 

public class Student{ } // API 클래스 선언

public class StudentExample { // 실행용 클래스
	public static void main(String[] args){
    	Student s1 = new Student();
        System.out.println("s1변수가 Student 객체를 참조합니다.");
    }
}

여기서 Student와 StudentExample 클래스의 용도에 대해 알아볼 필요가 있습니다. 자바를 처음 배울 때 저도 굉장히 이해가 되지 않았던 부분인데요!

클래스에는 두 가지 용도가 있다고 합니다. 하나는 라이브러리(API: Application Program Interface) 용이고, 다른 하나는 실행 용입니다. 라이브러리 클래스는 다른 클래스에서 이용할 목적으로 설계되고, 대부분 객체 지향 프로그램은 라이브러리와 실행 클래스가 분리되어있다고 합니다! 설계할 때 두 클래스를 분리하는 게 가급적 좋다고 합니다.

 

[reference]

  1. 접근제어자
  2. 이것이 자바다 186-196p, 신용권

'Programming > JAVA' 카테고리의 다른 글

[ JAVA ] 개발 환경 구축하기  (2) 2022.06.22
[ JAVA ] 기초 문법 2 - 참조 타입  (0) 2019.07.05
[ JAVA ] 기초 문법 1. 변수와 타입  (0) 2019.07.03