📚OOP ( Object Oriented Programming ) - 객체지향 프로그래밍
등장배경
정의한 기능의 흐름에 따라 순서대로 동작을 추가하며 프로그램을 완성시키는 방식인 순차적 (비구조적) 프로그래밍 방식과 C언어 같이 반복되는 동작을 함수 및 프로시저 형태로 모듈화 하는 방식인 절차적 (구조적) 프로그래밍을 묶기 위해 나온 것이 '객체 지향 프로그래밍'입니다.
순차적 (비구조적) 프로그래밍 방식은 정의한 기능의 흐름에 따라 순서대로 프로그램을 짜게 되어 직관적이어서 좋지만 프로그램의 규모가 커지면 커질수록 동작이 직관적이지 못하게 되었습니다.
그래서 등장한 것이 절차적 (구조적) 프로그래밍입니다.
절차적 (구조적) 프로그래밍에서 '절차'는 함수를 의미합니다. 이 패러다임이 등장하면서 프로그램을 설계하는 데에는 아주 좋았지만 유지보수면에서 좋지 못했습니다. 결국엔 모든 코드들이 톱니바퀴처럼 맞물려 있기에 코드의 일부분을 고치려면 전체적인 부분을 바꾸어야 하는 경우가 생기는 단점이 생겼습니다.
앞서 말한 단점들을 극복 하기 위해 프로그램의 변화에 대한 유연성을 높이고 부수적으로 개발 속도도 빠르게 하기위해 프로그램의 재사용성을 높여야겠다는 생각을 했습니다.
그래서 나온 것이 개발 방법론 중 하나인 객체지향 프로그래밍입니다!
📝OOP (객체지향 프로그래밍) 란?
개념
어떤 개념에 대한 자료형과 함수를 '객체' 형태로 묶어서 '객체'의 관점에서 프로그래밍하는 것을 의미합니다.
즉, 애플리케이션을 구성하는 요소들을 객체로 바라보고, 객체들을 유기적으로 연결하여 프로그래밍하는 것을 말합니다.
만약 자동차 관리 프로그램이 있고 객체지향으로 구현하게 된다면 타이어, 엔진, 유리 같은 자료형과 운전하기, 브레이크밟기 등의 메서드 등을 자동차라는 객체에 몽땅 묶어서 관리를 할 수 있고 추상적이었던 동작들이 훨씬 더 직관적으로 보이게 됩니다.
결론적으로 객체 간의 독립성이 뚜렷해지며 중복되는 코드의 양이 줄어들게 됩니다. 이는 결국 유지보수에 아주 용이해질 것입니다!
📑OOP의 특징
캡슐화 (Encapsulation)
하나의 객체에 대해 그 객체가 특정한 목적을 위한 필요한 변수나 메서드를 하나로 묶는 것을 의미합니다.
즉, 클래스를 만들 때 이 클래스에서 만들어진 객체가 특정한 목적을 잘 수행할 수 있도록 변수와 메서드 등으로 관련성 있게 클래스를 구성해야 합니다.
캡슐화를 하는 중요한 목적은 바로 정보 은닉입니다.
예를 들어 유저 정보를 가지고 있는 User라는 객체에서 유저의 정보가 Public으로 선언되어 있다면, 누구든 접근해서 유저 정보를 변경할 수 있기 때문에 private로 데이터를 보호해서 접근을 제한해야 합니다.
이렇게 보호된 변수는 getter나 setter들의 메서드를 통해서만 간접적으로 접근이 가능하도록 하는 것이 캡슐화의 중요한 목적입니다.
헷갈릴 수도 있는 것이 캡슐화랑 정보은닉은 동일한 개념이 아닙니다.
다만, 캡슐화를 하면 불필요한 정보를 감출 수 있기 때문에 정보은닉을 할 수 있다는 특징이 있습니다.
추상화 (Abstraction)
목적과 관련이 없는 부분을 제거하여 필요한 부분만을 표현하기 위한 개념입니다.
쉽게 말해 객체들의 공통된 특징을 파악해 정의해 놓은 설계 기법입니다.
대표적으로 추상클래스와 인터페이스가 있습니다.
다형성 (Polymorphism)
상속을 통해 기능을 확장하거나 변경하는 것을 가능하게 해 줍니다.
즉, 다형성이란 형태가 같은데 다른 기능을 하는 것을 의미합니다.
( 같은 동작이지만 다른 결과물이 나오는 것이 다형이다. )
대표적으로 Overriding과 Overloading을 사용합니다.
상속성, 재사용성 (Inheritance)
상속이란 기존 상위클래스에 근거하여 새롭게 클래스와 행위를 정의할 수 있게 도와주는 개념입니다.
자바에선 단일 상속 밖에 지원이 안되어 자바 8부터 인터페이스로 다중 상속을 지원시켜주었습니다.
그러나 인터페이스 존재이유가 다중 상속을 지원하기 위함이라고 생각하면 안 됩니다.
상속을 통해 코드의 중복을 없애고 유지 보수적으로 아주 좋습니다.
'Android Studio > - Programming' 카테고리의 다른 글
[안드로이드/Regex] 정규표현식, 회원가입 유효성 검사 (0) | 2024.04.08 |
---|---|
[코틀린] lateinit과 by lazy의 차이점 (0) | 2024.03.29 |
[코틀린] Abstract class와 Interface 차이점 (0) | 2024.03.19 |
[안드로이드/Radius] 레이아웃 둥글게 만들기 (2) | 2024.03.06 |
[안드로이드/StatusBar] 앱 상태바 색상 변경하는 방법 (0) | 2024.03.04 |
주코딩의 개발 노트!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!