객체지향언어 자바의 객체와 클래스를 알아보자
2025. 2. 3. 13:00ㆍJAVA
728x90
반응형
안녕하세요. 진득 코딩입니다.
프로그래밍을 할 때는 여러 가지 방법이 있습니다.
그중에서 자바는 객체지향언어로 객체와 클래스를 이용하여 프로그래밍을 하는 언어입니다.
이번 시간에는 객체지향언어와 객체, 클래스에 대해 알아보도록 하겠습니다.
객체지향언어의 역사
- 객체지향이론의 기본 개념은 '실제 세계는 사물(객체)로 이루어져 있으며, 발생하는 모든 사건들은 사물 간의 상호작용이다'라는 것입니다.
- 객체지향이론은 상속, 캡슐화, 추상화 개념을 중심으로 점차 구체적으로 발전되었습니다.
- 1960년대 중반에 객체지향이론을 프로그래밍언어에 적용한 시뮬라(Simula)라는 최초의 객체지향언어가 탄생하였습니다.
객체지향언어
- 객체지향언어는 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태의 것입니다.
- 이러한 규칙들을 이용해서 코드 간에 서로 관계를 맺어 줌으로써 보다 유기적으로 프로그램을 구성하는 것이 가능해졌습니다.
1. 코드의 재사용성이 높다.
- 새로운 코드를 작성할 때 기존의 코드를 이용하여 쉽게 작성할 수 있다.
2. 코드의 관리가 용이하다.
- 코드간의 관계를 이용해서 적은 노력으로 쉽게 코드를 변경할 수 있다.
3. 신뢰성이 높은 프로그래밍을 가능하게 한다.
- 제어자와 메서드를 이용해서 데이터를 보호하고 올바른 값을 유지하도록 하며, 코드의 중복을 제거하여 코드의 불일치로 인한 오동작을 방지할 수 있다.
- 객제지향언어의 가장 큰 장점은 '코드의 재사용성이 높고 유지보수가 용이하다.'는 것입니다.
- 앞으로 상속, 다형성과 같은 객체지향개념을 학습할 때 재사용성과 유지보수 그리고 중복된 코드의 제거, 이 세 가지 관점에서 보면 보다 쉽게 이해할 수 있습니다.
- 일단 프로그램을 기능적으로 완성한 다음 어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지를 고민하여 점차 개선해 나가는 것이 좋습니다.
클래스와 객체의 정의와 용도
- 클래스란 '객체를 정의해놓은 것', 또는 '객체의 설계도 또는 틀'이라고 정의할 수 있습니다.
- 클래스는 객체를 생성하는데 사용되며, 객체는 클래스에 정의된 대로 생성합니다.
클래스의 정의 : 클래스란 객체를 정의해 놓은 것이다.
클래스의 용도 : 클래스는 객체를 생성하는 데 사용된다.
- 객체의 사전적인 정의는 '실제로 존재하는 것'입니다.
- 객체지향이론에서는 사물과 같은 유형적인 것뿐만 아니라, 개념이나 논리와 같은 무형적인 것들도 객체로 간주합니다.
- 프로그래밍에서의 객체는 클래스에 정의된 내용대로 메모리에 생성된 것을 뜻합니다.
객체의 정의 : 실제로 존재하는 것. 사물 또는 개념
객체의 용도 : 객체가 가지고 있는 기능과 속성에 따라 다름
유형의 객체 : 책상, 의자, 자동차, TV와 같은 사물
무형의 객체 : 수학공식, 프로그램 에러와 같은 논리나 개념
- 클래스와 객체의 관계를 예를 들면, 제품 설계도와 제품과의 관계라고 할 수 있습니다.
- 클래스는 단지 객체를 생성하는데 사용될 뿐, 객체 그 자체는 아닙니다.
클래스 | 객체 |
제품 설계도 | 제품 |
TV 설계도 | TV |
붕어빵 기계 | 붕어빵 |
- 클래스의 인스턴스화(instantiate)이란 클래스로부터 객체를 만드는 과정을 의미합니다.
- 인스턴스(instance)란 어떤 클래스로부터 만들어진 객체를 의미합니다.
- 인스턴스는 객체와 같은 의미이지만, 객체는 모든 인스턴스를 대표하는 포괄적인 의미를 갖고 있으며, 인스턴스는 어떤 클래스로부터 만들어진 것인지를 강조하는 보다 구체적인 의미를 갖고 있습니다.
객체의 구성 요소 - 속성과 기능
- 객체는 속성과 기능, 두 종류의 구성요소로 이루어져 있습니다.
- 즉, 객체는 속성과 기능의 집합이라고 할 수 있습니다.
- 객체의 맴버(구성원, member)이란 객체가 가지고 있는 속성과 기능을 의미합니다.
- 클래스란 객체를 정의한 것으로 클래스에는 객체의 모든 속성과 기능이 정의되어 있습니다.
- 클래스로부터 객체를 생성하면, 클래스에 정의된 속성과 기능을 가진 객체가 만들어집니다.
속성(property) : 멤버변수(member variable), 특성(attribute), 필드(field), 상태(state)
기능(function) : 메서드(method), 함수(function), 행위(behavior)
- 멤버변수와 메서드를 선언하는데 있어서 순서는 관계없지만, 일반적으로 메서드보다는 멤버변수를 먼저 선언하고 멤버변수는 멤버변수끼리 메서드는 메서드끼리 모아 놓는 것이 일반적입니다.
인스턴스의 생성과 사용
- 클래스로부터 인스턴스를 생성하는 방법은 일반적으로 다음과 같이 합니다.
클래스명 변수명; //클래스의 객체를 참조하기 위한 참조변수를 선언
변수명 = new 클래스명(); //클래스의 객체를 생성 후, 객체의 주소를 참조변수에 저장
Tv t; //Tv클래스 타입의 참조변수 t를 선언
t = new Tv(); //Tv인스턴스를 생성한 후, 생성된 Tv인스턴스의 주소를 t에 저장
- 이 예제는 Tv클래스로부터 인스턴스를 생성하고 인스턴스의 속성(channel)과 메서드 (channelDown())를 사용하는 방법을 보여주는 예제입니다.
- 해당 예제를 단계별로 살펴보면 다음과 같습니다.
- Tv t;
- Tv클래스 타입의 참조변수 t를 선언합니다.
- 메모리에 참조변수 t를 위한 공간이 마련됩니다.
- 인스턴스가 생성되지 않았으므로 참조변수로 아무것도 할 수 없습니다. - t = new Tv();
- 연산자 new에 의해 Tv클래스의 인스턴스가 메모리의 빈 공간에 생성됩니다.
- 이 때, 멤버변수는 각 자료형에 해당하는 기본값으로 초기화됩니다.
- 그 다음에는 대입연산자(=)에 의해서 생성된 객체의 주소값이 참조변수 t에 저장됩니다.
- 이제는 참조변수 t를 통해 Tv인스턴스에 접근할 수 있습니다. - t.channel = 7;
- 참조변수 t에 저장된 주소에 있는 인스턴스의 멤버변수 channel에 7을 저장합니다. - t.channelDown();
- 참조변수 t가 참조하고 있는 Tv인스턴스의 channelDown메서드를 호출합니다.
인스턴스는 참조변수를 통해서만 다룰 수 있으며, 참조변수의 타입은 인스턴스의 타입과 일치해야 합니다.
- 해당 예제는 Tv클래스의 인스턴스 t1과 t2를 생성한 후에, 인스턴스 t1의 멤버변수인 chaanel의 값을 변경하였습니다.
- 같은 클래스로부터 생성되었을지라도 각 인스턴스의 속성(맴버변수)은 서로 다른 값을 유지할 수 있으며, 메서드의 내용은 모든 인스턴스에 대해 동일합니다.
- 해당 예제의 실행과정을 단계별로 살펴보겠습니다.
- Tv t1 = new Tv();
Tv t2 = new Tv();
- t1과 t2 인스턴스를 생성합니다. - t2 = t1; //t1이 저장하고 있는 값(주소)을 t2에 저장한다.
- t1은 참조변수이므로, 인스턴스의 주소를 저장하고 있습니다.
- 이 문장이 수행되면, t2가 가지고 있던 값은 잃어버리게 되고 t1에 저장되어 있던 값이 t2에 저장되게 됩니다.
- 그렇게 되면 t2 역시 t1이 참조하고 있던 인스턴스를 같이 참조하게 되고, t2가 원래 참조하고 있던 인스턴스는 더 이상 사용할 수 없게 됩니다.
- 자신을 참조하고 있는 참조변수가 하나도 없는 인스턴스는 더 이상 사용될 수 없으므로 '가비지 컬렉터(Garbage Collector)'에 의해 자동적으로 메모리에서 제거됩니다. - t1.channel = 7; //channel 값을 7로 한다.
- t1이 참조하고 있는 값을 7로 저장합니다. - System.out.println("t1의 channel값은 " + t1.channel + "입니다.");
System.out.println("t2의 channel값은 " + t2.channel + "입니다.");
- 이제 t1, t2 모두 같은 Tv클래스의 인스턴스를 가리키고 있기 때문에 t1.channel과 t2.channel의 값은 7이 됩니다.
- 참조변수에는 하나의 값(주소)만이 저장될 수 있으므로 둘 이상의 참조변수가 하나의 인스턴스를 가리키는(참조하는) 것은 가능하지만 하나의 참조변수로 여러 개의 인스턴스를 가리키는 것은 가능하지 않습니다.
객체 배열
- 많은 수의 객체를 다뤄야할 때, 객체 역시 배열로 다루는 것이 가능하며, 이를 '객체 배열'이라고 합니다.
- 객체 배열은 참조변수들을 하나로 묶은 참조변수 배열입니다.
- 위 코드와 같이 길이가 3인 객체 배열 tvArr을 생성하면, 각 요소는 참조변수의 기본값인 null로 자동 초기화 됩니다.
- 이 객체 배열은 3개의 객체, 정확히는 객체의 주소를 저장할 수 있습니다.
- 객체 배열을 생성하는 것은, 그저 객체를 다루기 위한 참조변수들이 만들어진 것일 뿐, 아직 객체가 저장되지 않았습니다.
- 그래서 위 코드와 같이 객체를 생성해서 객체 배열의 각 요소에 저장해야 합니다.
- 위 코드와 같이 배열의 초기화 블럭을 사용하면, 한 줄로 간단히 할 수 있습니다.
- 객체의 수가 많을 때는 for문을 사용하면 됩니다.
- 객체 배열도 같은 타입의 객체만 저장할 수 있습니다.
- '다형성(polymorphism)'을 배우고 나면, 하나의 배열로 여러 종류의 객체를 다룰 수 있게 됩니다.
클래스의 또 다른 정의
- 클래스는 '객체를 생성하기 위한 틀'이며 '클래스는 속성과 기능으로 정의되어 있다.'라고 배웠습니다.
- 이는 객체지향이론의 관점에서 내린 정의이고, 프로그래밍적인 관점에서 클래스의 정의와 의미를 살펴보도록 하겠습니다.
1. 클래스 - 데이터와 함수의 결합
1.변수 : 하나의 데이터를 저장할 수 있는 공간
2. 배열 : 같은 종류의 여러 데이터를 하나의 집합으로 저장할 수 있는 공간
3. 구조체 : 서로 관련된 여러 데이터를 종류와 관계없이 하나의 집합으로 저장할 수 있는 공간
4. 클래스 : 데이터와 함수의 결합(구조체 + 함수)
- 하나의 데이터를 저장하기 위해 변수를, 같은 종류의 데이터를 보다 효율적으로 다루기 위해 배열이라는 개념을 도입했습니다.
- 후에는 구조체(structure)가 등장하여 자료형의 종류에 상관없이 서로 관계가 깊은 변수들을 하나로 묶어서 다룰 수 있도록 하였습니다.
- 객체지향언어에서는 변수(데이터)와 함수를 하나의 클래스에 정의하여 서로 관계가 깊은 변수와 함수들을 함께 다룰 수 있게 하였습니다.
- 클래스는 서로 관련된 변수들을 정의하고 이들에 대한 작업을 수행하는 함수들을 함께 정의한 것입니다.
- 문자열을 클래스로 정의한 이유는 문자열과 문자열을 다루는데 필요한 함수들을 함께 묶기 위해서입니다.
2. 클래스 - 사용자정의 타입(user-defined type)
- 프로그래밍언어에서 제공하는 자료형(primitive type) 외에 프로그래머가 서로 관련된 변수들을 묶어서 하나의 타입으로 새로 추가하는 것을 사용자정의 타입(user-defined type)이라고 합니다.
- 다른 프로그래밍언어에서도 사용자정의 타입을 정의할 수 있는 방법을 제공하고 있으며 자바와 같은 객체지향언어에서는 클래스가 곧 사용자 정의 타입입니다.
- 비객체지향적 코드와 객체지향적 코드를 표로 정리해서 살펴보도록 하겠습니다.
비객체지향적 코드 | 객체지향적 코드 |
int hour1, hour2, hour3; int minute1, minute2, minute3; float second1, second2, second3; |
Time t1 = new Time(); Time t2 = new Time(); Time t3 = new Time(); |
int[ ] hour = new int[3]; int[ ] minute = new int[3]; float[ ] second = new float[3]; |
Time[ ] t = new Time[3]; t[0] = new Time(); t[1] = new Time(); t[2] = new Time(); |
이번 시간에는 본격적으로 자바라는 언어를 배우기 시작하는 포스팅이라고 볼 수 있습니다.
자바라는 언어를 제대로 활용하기 위해서는 객체지향이론에 대해 학습해야 합니다.
이 객체지향이론의 학습의 시작이 바로 객체와 클래스입니다.
앞으로 계속해서 사용하기도 하고 이 개념을 잘 잡고 가야 앞으로 포스팅할 내용에 대해 이해하기에도 수월할 거라고 생각하기 때문에 잘 숙지하고 넘어가시기 바랍니다.
이번 포스팅은 여기까지입니다.
궁금하신 사항이나 문의하실 사항이 있다면 댓글로 남겨주시면 열심히 답글 달도록 하겠습니다.
끝까지 봐주셔서 감사합니다.😊
728x90
반응형
LIST
'JAVA' 카테고리의 다른 글
자바 매개변수와 메서드와 재귀 호출에 대해 알아보자 (0) | 2025.02.05 |
---|---|
자바 메서드와 JVM의 메모리 구조에 대해 알아보자 (0) | 2025.02.04 |
자바 다차원 배열과 가변 배열에 대해 알아보자 (2) | 2025.01.31 |
자바 String 배열에 대해 알아보자 (0) | 2025.01.30 |
자바 배열에 대해 알아보자 (2) | 2025.01.29 |