다라다라V
article thumbnail
Published 2022. 10. 12. 01:29
[JAVA] 04. 클래스와 객체 코딩언어/JAVA
728x90
반응형

반복되는 모양의 쿠키를 만들 때는 쿠키틀을 통해 간편하게 각 쿠키들을 만들 수 있습니다. 컴퓨터 역시 각 객체를 쉽게 만드는 클래스라는 기능을 제공합니다.

프로그래밍을 하다 보면 객체 지향 방식과 절차 지향 방식 등 다양한 프로그래밍 개발 방식에 대해 많이 들어볼 수 있습니다. 또한 반복되는 변수들과 함수들을 안전하고 편리하게 관리하는 방법을 찾아보게 됩니다.

오늘은 객체 지향 언어와 절차 지향 언어의 차이점과 객체 지향 언어의 특징을 배워보겠습니다. 객체 지향 언어의 대표적 예시인 자바의 클래스와 객체에 대해 알아보고, 객체 지향 언어로써 자반의 특징을 알아보겠습니다. 마지막으로 자바 클래스의 기본 구조를 알아봅니다.

📌 객체 지향 언어의 특징

📚 절차 지향 언어 vs 객체 지향 언어

📃 절차 지향 언어 (Procedural Programming)

커피를 내린다고 가정을 해봅시다. 이 과정을 서술하면

등으로 서술될 수 있을 것입니다.

프로그래밍 언어에서 이렇게 문제 해결 방법을 각 단계별로 나누는 것을 절차 지향 프로그래밍 (Procedural Programming)라고 합니다. C언어와 같은 절차 지향 언어는 데이터를 먼저 기술하고 데이터를 사용하고 조작하는 함수를 만듭니다. 이렇게 절차 지향 언어 함수 기반을 사용해 각종 함수로 데이터를 조작하며 문제를 해결해 나갈 수 있습니다. 가장 큰 문제를 작은 문제들로 나누어 해결하는 Top-Down 방식을 이용하여 문제를 해결합니다.

 

📃 절차 지향 언어의 문제점

하드웨어와 소프트웨어가 빠르게 변화하고 발전하면서 절차 지향 언어의 단점이 드러나게 됩니다.

  • 유지 보수의 어려움
    모든 구성요소가 유기적으로 연결되어 하나의 요소가 고장 났을 때, 시스템 전체에 문제를 일으킬 수 있습니다.

  • 엄격하게 순서가 정해져 비효율적
    실행 순서가 정해져 있어 코드의 순서가 변경될 때 결과가 달라질 수 있습니다.

 

📃 객체 지향 언어(Object-Oriented Language)

다시 커피를 내린다고 가정을 합시다. 이번에는 전과 다르게 구체적인 사물, 사람, 개념 등으로 과정을 분리해봅시다.

등과 같이 기술될 수 있을 것입니다. 전원 켜기는 커피 기계의 전원을 켤 것이고, 커피 원두 캡슐은 커피 기계에 커피 원두 캡슐을 넣을 것입니다.  

프로그래밍 언어에서는 정보를 담고 있는 데이터와 이를 조작하는 함수 하나로 묶어 객체(Object)를 만들 수 있습니다. 객체들 간의 상호작용으로 문제를 해결하는 언어를 객체 지향 언어 (Object-Oriented Language)라고 합니다. 실제 객체는 스스로 기능을 할 수 있어 프로그래머는 작동 과정을 알 필요 없이 중재만 하면 됩니다. 객체 지향 언어는 가장 작은 문제들부터 하나씩 해결해가며 큰 문제를 해결하는 Bottom-Up 방식으로 프로그래밍합니다.


📚 객체 지향 언어(Object-Oriented Language)의 특징

객체지향 언어는 다음의 특징들을 가집니다.

  • 추상화 (Abstraction) : 문제 해결을 위해 관심 있는 부분에만 집중하여 해결
  • 캡슐화 (Encapsulation) : 연관된 데이터와 알고리즘을 한 덩어리로 묶음
  • 정보은닉 (Information Hiding) : 묶인 모든 것 중 중요한 인터페이스만 드러내고 내부 구현은 숨김
  • 상속성 (Inheritance) : 한 객체의 성질을 다른 객체가 물려받음
  • 다형성 (Polymorphism) : 한 형태로 보이나 다른 역할들을 수행할 수 있음

📚 객체 지향 언어의 장점

  • 사용된 코드와 데이터가 뭉쳐져 있어 모듈화 된 코드의 재사용이 용이
  • 잘 작성된 코드를 재사용하기에 신뢰성 있는 소프트웨어를 쉽게 작성
  • 디버깅이 쉬움
  • 업그레이드 등의 유지 보수가 용이

📌 클래스와 객체의 기초 개념

📚 객체(Object)

  • 현실 세계의 사물 또는 대상, 관념을 모방한 프로그램 상의 객체
  • 일 처리를 위한 객체가 갖는 "데이터" 객체가 제공하는 "기능"으로 표현

📚 OOP 특징 1: 추상화(Abstraction)

  • 추상화 : 객체를 만들 때는 객체에게 관심 있는 부분에만 관심을 가져야 함
  • 객체들의 공통된 속성과 행위를 추출
  • 객체의 속성과 행위 중에서 관심 대상만 추출해 표현하고 아닌 부분은 드러내지 않음

📚 객체 지향(Object-Oriented) 프로그래밍

  • 현실에 존재하는 사물과 사물의 상태, 그 행동을 실체화시키는 프로그래밍
  • 객체 = 데이터(속성) + 알고리즘(메서드)
  • 하나의 프로그램을 상호 연결된 객체 집합의 상호작용을 통한 문제 해결을 추구
  • 문제와 관련된 객체를 만들고 객체 간의 메시지 교환으로 문제 해결

📚 클래스와 객체의 관계

별 모양 쿠키를 만든다고 생각해봅시다. 많은 쿠키를 구워야 할 때 쿠키 하나씩 모양을 빚는 것은 비효율적이고 힘들 일

이 될 것입니다. 별 모양 틀을 만들고 그 틀에 맞추어 쿠키를 찍어낸다면 효율적으로 작업할 수 있을 것입니다.

 프로그램 언어에서도 똑같습니다. 만들고자 하는 틀이 "클래스", 그 틀로 만든 것이 "객체"입니다.

또한 쿠키의 모양은 같지만 초콜릿 쿠키, 버터 쿠키 등 다양한 속성 값을 가질 수 있을 것입니다.

  • 클래스(Class) : 객체를 만들어 내기 위한 설계도 혹은 틀
  • 객체(Object) : 클래스 모양 그대로 생성된 실체, 객체를 클래스의 인스턴스(instance)라고도 부름
  • 클래스는 하나지만 객체들은 수 없이 생산될 수 있음
  • 객체들은 클래스의 모양대로 동일한 속성을 가지지만, 고유한 값으로 구분

📚 객체의 구성요소

📃 속성 (attributes)

  • 객체의 상태 정보인 특성을 표현
  • 정적인 성질

📃 행위 (behaviors)

  • 객체 내부에서 처리할 일이나 객체들 간에 영향을 주고받는 일
  • 동적인 일을 처리

📚 클래스(class)

  • 같은 종류의 객체의 공통된 '데이터 구조' '기능'을 따로 뽑고 추상적으로 표현하여 클래스를 정의
  • 클래스 정의는 직접 객체가 만들어지거나 실행되는 것이 아닌, 틀을 정의할 뿐
  • 멤버 필드(속성) 정의와 메서드(행위) 정의 두 범위로 나뉨

📚 OOP 특징 2: 캡슐화(Encapsulation)

  • 데이터와 그와 관련된 연산(함수)들을 객체(object)로 묶음
  • 연관된 처리를 하는 행위와 상태 데이터를 묶어 복잡한 과정은 숨김
  • 꼭 필요한 인터페이스만 외부에 나타내 쉽게 사용하도록 함

📌 자바 클래스의 기본 구조 및 사용

📚 기본 클래스의 구조

  • 변수와 상수로 상태 정보를 저장하는 멤버 필드, 행위 정보를 기술하는 메서드로 구성
  • 클래스 멤버 및 메서드 사용을 어느 정도까지 허용할지를 정하는 접근 제한자
  • 클래스의 특징을 지정하는 클래스 종류
  • 클래스는 세미콜론(;)으로 끝나지 않고, 함수의 구현을 몸체에서 기술

📚 멤버 필드

[접근 제한] [static] <자료형> <식별자>;
  • 멤버 필드는 instance / static 두 가지로 분리됨
  • instance 멤버 필드 고유한 메모리 저장 공간이 할당됨
  • static 멤버 필드는 프로그램이 시작되면 메모리를 할당 받음

* 접근 제한은 이 멤버를 어느 범위에서 접근할 수 있는지를 지정합니다. 각 변수별로 지정할 수 있으며 대표적으로 public 키워드가 있습니다. static 멤버 변수를 선언하면 모든 객체가 멤버를 공유합니다


📚 메서드

  • 객체가 수행될 수 있는 동작을 정의
  • 스스로 상태 값을 저장하고 그 상태 값으로 행위를 수행한다는 점에서 단순 변수들과는 다른 특징
  • 멤버 필드를 조작하는 안전한 방법을 제공 ex) getter/setter
  • 클래스 정의 안에 메서드 구현부를 모두 기술

📚 메서드의 작성

  • 클래스 정의 안에 객체의 행위를 기술
  • 실제를 수행하는 문장들을 { } 안에 나열
  • 인수들은 순서대로 매개변수를 통해 전달 받음
  • 반환 값은 return을 통해 받고, 반환 값이 아니면 void 밖에 없음

📚 메서드의 호출

[변수 = ] 객체명. 메서드명 (인수1, 인수2, ... , 인수n)
  • 객체에 지정된 행위를 수행하도록 하는 것
  • 클래스를 정의하는 것은 메서드를 자동 실행하는 것이 아닌 호출되어야 실행될 수 있음
  • 메서드 호출 시 호출 측은 인수를 넘겨줄 수 있고, 호출의 결과를 반환할 수도 있음

📚 동적 메모리 할당

  • 동적 할당되는 객체는 실제로 많이 사용되고 필요에 따라 지역적으로 사용되도록 만들 수 있음
  • JAVA 프로그래머는 이러한 고민들을 바탕으로 객체는 반드시 동적 할당을 통해 만들어지도록 함
  • 프로그래머가 원하는 순간에 원하는 크기의 메모리를 할당받는 방법
  • new 연산자를 사용하여 동적 할당된 크기를 자동으로 계산해줌
  • 참조 자료형 변수에 실제 값에 대한 저장공간을 할당받기 위해 필요

동적 할당받은 메모리가 더 이상 참조되지 않는다면 JVM에 의하여 자동으로 회수됩니다. 이렇게 참조되지 않는 동적 할당된 메모리를 자동 할당 해제하는 것을 가비지 컬렉션(Garbage Collection)이라고 합니다. JVM 가비지 컬렉터에 의해 메모리 부족을 방지할 수 있습니다.


📚 객체의 생성과 멤버 접근

📃  참조 변수의 선언

Circle c1;

클래스 타입에 변수를 선언합니다. 이 변수는 참조 자료형으로 각 객체의 id값만을 저장합니다.

 

📃 선언된 변수에 객체를 생성

c1 = new Circle();

동적 할당 연산자 new를 이용해 변수에 객체를 생성합니다. 객체 생성 시 Circle();과 같이 ( )를 반드시 작성해야 합니다. 이는 생성자와 관련이 있습니다.

 

📃  멤버 접근

c1.radius = 1;
double area = c1.getArea();

c1은 참조 변수입니다. 그러나 자바에서 객체에 접근하는 방법은 참조 변수를 이용해 동적 할당받은 부분으로 접근하는 방법밖에 없기 때문에 c1을 객체라고도 합니다. 멤버 접근은 .연산자를 사용합니다.

반응형
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!