객체 지향 프로그래밍(OOP)
객체 지향 관련해서는 상당히 오랜기간의 학습이 필요하고, 개발을 하면서 좀 더 공부하면 자연스럽게 습득할 수 있다는 얘기를 들은 기억이 있다. 개관이기에 대략적으로 알아보겠다.
- Object-Oriented Programming, OOP 라고 불리는 객체 지향 프로그래밍은 소프트웨어 개발의 패러다임 중 하나로, 객체라는 독립적인 단위로 나누어서 접근하는 방식이다.
- 이는 코드의 재사용성, 확장성, 유지보수성을 높이는데 중점을 두며 다양한 객체들이 상호작용해서 시스템을 구성한다.
- 현재는 객체지향으로 프로그래밍을 할 것이라는 전제하에 많은 객체지향 언어들이 나오고 있다. 왜냐하면 복잡한 시스템을 구조화하고 관리하는데 유용하기 때문이다.
- 이전에는 탑-다운 방식으로 문제를 해결했으나, 이는 전체가 완성되어야 제대로 되었는지 확인할 수 있는 문제가 발생한다.
- 그래서 상태(속성)와 행동(매서드)을 갖는 독립적인 단위인 객체라는 개념을 도입해서 함수+데이터를 묶어 객체 단위로 프로그래밍을 한다. 만약 특정 기능에서 문제가 발생한다면 해당 객체를 찾아서 확인해보면 된다.
- 이외에도 클래스, 상속, 다형성, 캡슐화, 추상화 등의 개념이 있으나 다음에 꼭 알아보자..!
- JAVA, C++, Python, C# 등이 있다.
객체 지향 프로그래밍의 장점
-
코드 재사용성: 클래스를 통해 한 번 정의한 코드를 여러 객체에서 재사용할 수 있다.
-
유지보수 용이: 객체 간의 결합도가 낮아 변경이 필요한 부분만 수정하면 된다.
-
확장성: 새로운 기능이나 객체를 추가할 때 기존 시스템에 최소한의 영향을 미치도록 설계할 수 있다.
-
모듈화: 시스템을 여러 개의 독립적인 객체로 나누어 모듈화할 수 있으며, 각 객체는 독립적으로 개발, 테스트 및 유지보수할 수 있다.
객체 지향 프로그래밍의 단점
-
복잡성 증가: 객체 지향 설계는 클래스, 상속, 다형성 등의 개념을 도입하기 때문에 초기 설계와 이해가 복잡할 수 있다.
-
성능 오버헤드: 객체 지향 프로그래밍에서는 메서드 호출, 객체 생성 등으로 인해 성능 오버헤드가 발생할 수 있다. 특히, 많은 객체를 생성하거나 복잡한 상속 구조를 사용할 때 성능에 영향을 미칠 수 있다.
변수와 데이터 타입
사용하는 언어에 따라서 변수를 선언하는 방식이 다르다. 크게 Static Typing과 Dynamic Typing으로 나눈다.
Static Typing
-
변수의 타입이 코드가 실행되기 전에 결정되는 방식이다. 즉, 타입이 프로그램 작성중에 자료형을 명시하고 이 타입에 따라서 코드가 컴파일 된다.
-
명확하고 정교한 코드를 추구하며, 컴퓨터적 구조가 눈에 띈다. 실수를 방지하고 체계적으로 하기위해서 문법상의 제약이 많다.
-
실행속도가 빠르고 많은 사람들과 협업할때 유용하다.
-
Java, C++, C# 등이 있다.
Dynamic Typing
-
변수의 타입이 프로그램이 실행되는 동안 결정되는 방식이다. 즉, 변수를 선언할 때 타입을 명시할 필요 없이, 변수에 값을 할당하는 순간 해당 타입이 결정된다.
-
자료형을 미리 정하지 않기에 간결하고 편리한 코드를 추구한다. 컴퓨터적 구조가 생략되어서 실행속도가 느리다. 코드의 안정성이 떨어질 수 있으며, 에러를 조기에 발견하기 어렵다.
-
Python, JavaScript, Ruby 등이 있다.
라이브러리와 프레임워크
라이브러리와 프레임워크는 소프트웨어 개발에서 코드 재사용과 효율성을 높이기 위해 사용되는 중요한 개념이다. 목적은 비슷하지만 사용하는 방식과 역할에서 차이가 있다.
라이브러리 (Library)
- 특정 기능이나 서비스를 제공하는 코드 집합이다. 애플리케이션의 특정 부분에서 필요한 기능을 구현하는데 도움이 된다.
- 이미 누군가가 만들어 둔 도구를 가져와서 사용하는데, 개발자의 의도에 따라 얼마든지 선택적으로 커스텀하여 사용할 수 있다.
- jQuery, Numpy 등이 있다.
프레임워크(Framework)
- 애플리케이션의 전체 구조나 설계 패턴을 제공하는 보다 포괄적인 도구이다.
- 개발자는 프레임워크의 규칙에 따라서 애플리케이션을 구현해야한다.
- 틀이 이미 짜여져있기 때문에 마음대로 바꾸지는 못하지만 틀 안에서 최소한의 노력으로 프로그램을 만들 수 있다. 인증, 라우팅, DB연동 등 다양한 기능을 내장하고 있다.
- Spring(Java), Django(Python), Angular(JavaScript) 등이 있다.
좋은 코드란?
단순히 애플리케이션이나 프로그램만 잘 실행된다고 좋은 코드는 아닐 것이다. 어떤 특징을 갖추어야하는지 알아보되, 코딩할때 유념하도록 해야겠다.
- 가독성: 주석처리를 통한 comment 전달이 중요하다. 하지만 너무 자주쓰는 것은 오히려 가독성을 떨어뜨린다. 그리고 명확한 변수 및 함수 이름이 중요하다. 충분히 구체적이고 간결한 이름이여햐 하며, 목적을 쉽게 이해할 수 있어야한다.
- 확장성: 객체 지향 프로그래밍 등 유연한 설계를 통해 새로운 기능 추가나 변경이 쉬워야한다. SW 특성상 자주 변경사항이 발생하기에 중요하다.
- 효율성: 코드가 수행하는 작업의 시간 등을 고려하여 효율적인 알고리즘, 자료구조를 사용하는 것이 중요하다. 성능 분석 도구를 사용하여 최적화한다.
- 안정성: 예상치 못한 문제가 발생할 수 있는데, 이러한 상황에서도 안정적으로 동작하도록 에러 상황에 대한 처리 로직이 필요하다.
UI(User Interface) 디자인
코딩을 하면서 디자인 부분에서 굉장히 애를 먹는다. 나름 예쁘게 한다고 했지만 결과물들은 유독 허접해보이는 경우가 대반이다. 그렇다면 좋은 디자인은 뭘까?
일관성
- 사용자 인터페이스에서 요소와 행동이 일관되게 유지되는 것을 의미한다.
- 이는 사용자가 인터페이스를 학습하고 예측할 수 있게 하여, 사용자 경험(UX)를 향상시키는데 도움이 된다.
- 버튼, 링크 등 같아야 하는 것은 일관성 있게 유지되는 것이 좋다.
위계
- 정보와 요소 간의 중요성과 관계를 시각적으로 표현하는 원칙이다.
- 사용자에게 중요한 정보를 쉽게 인식하고 이해할 수 있도록 돕는다.
- 시각적인 강조, 위치를 통한 강조(좌상단) 등을 이용할 수 있다.
게슈탈트의 원리와 공통 영역의 원리, 유사성의 원리
- 관련 있는 내용은 가깝게한다. 멀리 떨어뜨려만 놔도 다른 정보로 인식할 수 있다.
- 관련 있는 정보를 구분된 공통 영역안에 넣어놓으면 해당영역의 내용들은 비슷하다고 인식할 수 있다.
- 비슷한 요소들에 강한 유사성을 부여하면, 굳이 내용을 보지않아도 이전 요소와 비슷하다는 것을 알 수 있다.
위와 같은 정보들을 UI디자인할때 참고만해도 꽤나 깔끔하고 알아보기 쉽게 바뀔 수 있다.