본문 링크

마이데이터 시대, 차별화 필요한 개인자산관리

2017년 앱 출시 이후, 초기에는 신용카드 추천 서비스로 시작했다가 마이데이터 시대로 접어들면서 데이터 관리 앱으로 거듭나겠다는 포부를 밝힘

초기

  • 강력한 가계부 기능 덕분에 이름을 알림
  • 정보를 긁어와 보여주는 스크래핑 방식 사용
  • 홈페이지의 레이아웃을 바꾸기만 해도 다시 작업해야 하는 번거로움이 있어 당시 유사 서비스가 드물었음
  • 은행, 카드사는 고객이 웹사이트에 직접 접속해야 의미 있는 MAU 확보가 가능한데 로봇이 와서 정보만 빼가니 서버비만 아까운 상황

⇒ 현업에서 논란이 적지 않았음

 

현재

  • 2022년 1월, 마이데이터가 시작되면서 스크래핑 방식은 불법이 됨
  • 마이데이터 사업자 라이선스를 받아 정해진 API 규격에 맞춰 데이터를 주고받아야 함
  • 다양한 사업자들이 PFM(Personal Finance Management) 서비스를 시작
  • 초기에 개인자산관리 기능을 제공하며 등장한 뱅샐에게는 달갑지 않은 상황

 


강력한 가계부 기능, 대중이 원할까

모바일 앱에서 개인자산관리는 얼마나 상세하게 이뤄져야 하는 걸까? 어떻게 해야 더 많은 Mass(대중) 고객을 사로잡을 수 있을까?

자산을 관리하는 사람들의 3가지 부류

  1. 자산관리를 안 하는 사람 (애초에 관리할 것이 별로 없어 니즈도 적음)
  2. 많은 금융 거래를 하기에 자산 관리 니즈는 있지만, 시간과 노력을 들이고 싶지는 않은 사람 (누가 정리해주면 볼 용의는 있지만 딱 거기까지)
  3. 자산 관리를 칼같이 하는 사람 (시간과 노력을 들이더라도 정확한 데이터를 보겠다)

 

사업 방향

  • 뱅샐은 태생부터 데이터와 자산 관리에 특화된 서비스로, 세 번째 부류에 맞는 상세한 메뉴를 제공함. 다만 기능이 다양한 만큼 손이 많이 감
  • 하지만 1, 2번째 사람들이 이른바 ‘매스 고객’이며, 그들은 굳이 뱅샐을 쓰지 않아도 됨
  • 하이엔드 가계부 앱으로 포지셔닝하는 것도 나쁘지 않은 전략이지만, 사용자를 더 늘리기 위해서는 연구가 필요함

 


건강 데이터, 미래 사업 전략 될까

유전자 검사 서비스

  • 21년 10월부터 무료 유전자 검사 서비스를 선착순으로 제공
  • 서비스를 시작한 지 1년이 넘었음에도 반응은 뜨거움
  • 유전자 검사의 가격은 10~15만원 수준

⇒ “금융 데이터뿐 아니라 건강 데이터까지 확보하여 향후를 대비하겠다는 포석
    “개인에게 최적화된 건강 관리, 보험 설계 등의 서비스를 제공하겠다”

 

건강 서비스

  • 현재도 건강 탭을 핵심 기능 중 하나로 취급
    • 건강보험관리공단에서 건강검진 자료를 연동하여 조회
    • 이를 기반으로 각종 질병 발병률을 보여줌

⇒ “향후 의료 마이데이터 시대를 대비한 것”

 

의료 마이데이터

  • 지난 몇 년간 금융 마이데이터가 부각되어 많은 사람들이 마이데이터를 금융 분야의 변화로만 생각하지만, 실제로는 행정/의료/교육 등 다양한 분야에서 마이데이터의 활용을 위한 준비가 진행되고 있음
  • 정부는 현재 Health Myway라는 이름으로 2023년 7월부터 의료 마이데이터를 상용화할 예정임
  • 의료법에 따라 민간기업에는 개인진료기록을 전송할 수 없기 때문에 민간 기업의 참여는 제외됨
  • 보건복지부가 2024년 통과를 목표로 의료법 개정을 추진 중이니 해당 사업은 그 이후가 될 전망

 


마치며

  • 작년 말 뱅크샐러드는 ‘금융 건강 분야에서 중립적으로 초개인화 서비스를 하는 유일한 데이터회사’를 목표로 언급함
  • 그러기 위해서는 매스 고객을 더 유입할 방안을 찾아야 함
  • 이대로는 다소 마니악한 서비스가 될 가능성이 높음
  • 금융과 의료 모두 관(官)의 의사 결정에 따라 크게 방향이 바뀌는 영역인 만큼 이에 대한 대비도 필요
  • 수집되는 데이터가 모두 민감하기 때문에 이를 활용한 수익 모델을 어떻게 만들어낼 수 있을지도 고민해야 함
본문 링크

메타버스와 NFT

메타버스

  • 메타버스에서는 현실의 나를 대리하는 아바타를 통해 일상 생활과 경제 생활을 영위할 수 있음
  • 2022년: 게임이나 SNS에 관련된 제한된 영역에 그침
    • 공간 구현을 위한 연관 기술이 아직 충분한 궤도에 오르지 못했음
    • 가상경제 구현에 필요한 NFT와 디지털 화폐의 실용화에도 한계가 있었음
  • 2023년: 하드웨어 기기의 출시와 NFT의 비즈니스 도입 활성화로 상황이 변화할 전망
    • 애플이 1분기 내로 XR(확장 현실) 기기를 선보일 예정
    • 삼성은 MS와 함께 AR 헤드셋을 개발 중, 2024년까지는 출시할 것

 

NFT

  • “크립토 윈터(블록체인 하락세)”
  • 그럼에도 불구하고 NFT를 현실 경제와 연결하려는 시도
    • 스타벅스: 웹3과 NFT를 사용해 참여자 보상에 초점을 맞춘 ‘스타벅스 오디세이’라는 새로운 멤버십 서비스 베타 버전을 출시
    • 넷마블, 넥슨, 크래프톤: 자체 코인 및 NFT를 활용해 수익 창출이 가능한 C2E(Create to Earn) 시스템이 접목된 프로젝트를 진행 중

 


슈퍼 앱

중국의 알리페이와 위챗에서 시작된 모델로, 생태계를 구성하는 여러 기능들을 하나의 애플리케이션에 결합하는 것

등장 배경

  • 애플과 구글이 프라이버시 정책을 강화하며, 기업들은 사용자의 다른 서비스에 걸친 활동들을 추적하기 어려워짐
  • 고객 빅데이터를 수집하고, 맞춤형 서비스에 활용하기 위해 비교적 제약이 덜한 자체 슈퍼 앱이 주목

⇒ 국내외 기업들은 분야를 막론하고 슈퍼 앱을 주요 전략으로 내세워 버티컬 플랫폼을 중심으로 서비스를 확장 중

 

활용

  • 국외
    • 페이팔(온라인 결제 플랫폼), 우버(승차 공유 서비스)와 같은 B2C
    • HR 솔루션 등의 B2B SW 시장에서도 주목
  • 국내
    • 토스, 야놀자, 쏘카 등 대표 테크 기업들이 서비스 라인업을 확장 중
    • 네이버, 카카오를 위시한 빅테크에서 마이데이터와 인증이 활성화되면 더 강력한 위력을 발휘할 것

 


생성형 AI와 신뢰 가능성

생성 인공지능 모델

  • 이용자가 입력한 음성, 텍스트, 이미지를 학습해 스스로 데이터를 만들어내는 모델
  • 인간 대신 공모전을 수상한 미드저니, 영어로 텍스트를 입력하거나 이미지를 삽입하면 그림을 만들어주는 DALL-E 2, 대화형 ChatGPT 등

⇒ 동시에 ‘신뢰 가능한 AI’에 대한 관심도 부상

 

대응

  • 우리나라: 인공지능 법안과 가이드라인을 예고하고 발표함으로써 AI 윤리 규제를 시작
  • 일부 선진국: 관련 표준을 수립하고, 모니터링하기 위한 기술 및 솔루션 시장이 함께 성장 중
  • 출시한 AI 모델이 공정한지 테스트하고 문제를 개선하기 위한 빅테크 기업의 편향성 검증 도구도 존재

⇒ 편향 문제가 나타날 수 있는 이미지를 미리 훈련 데이터에서 제거하는 등 AI의 정확도와 윤리성을 높이기 위한 시도는 지속적으로 발전할 것

 


적응형 AI

AI 엔지니어링

  • AI의 복잡한 의사결정 과정과 블랙박스 문제 등으로 신뢰성 이슈가 발생
  • 많은 기업이 AI를 비즈니스에 접목하는 데 어려움을 겪음

⇒ 가트너(2022)는 AI 모델을 프로덕트로 만드는 방법에 대한 프로세스 및 모범 사례인 ‘AI 엔지니어링’을 트렌드로 제시

 

적응형 AI

  • Adaptive AI는 이러한 AI 엔지니어링에서 한 단계 더 나아간 형태로, AI 엔지니어링 중에서 변화 관리 측면을 대폭 강화한 것
  • 역동성이 높은 환경에서 실시간 피드백을 사용해, 시스템이 실제 운영 중에도 변화하는 환경에 적응할 수 있도록 학습 관행과 행동을 조정할 수 있는 AI 시스템을 뜻함
  • AI를 적극적으로 활용하는 기업들은 로그, 추적, API 호출 등을 활용해 의사 결정
  • 데이터를 활용할 수 있을 뿐만 아니라 변화에도 더 유연하게 대처할 수 있게됨

⇒ 가트너는 2026년까지 적응형 AI를 구축/관리하기 위해 AI 엔지니어링을 도입한 기업들은 운영 부문에서 동종 업체를 최소 25%이상 앞설 것으로 예측

 


모빌리티 영역의 확장

전망

  • 모빌리티란 사람들의 이동을 편리하게 만드는 각종 서비스나 이동 수단을 총칭하는 말
  • 2023년에는 전기차 보급이 본격화되고, 자율주행차의 전동화가 더욱 진전되어 다양한 커넥티드 카 기술이 결합될 전망
  • 자율주행이 자동차에서 농기계, 로봇 등으로 확장되고 있음

 

스마트 시티와의 연관성

  • 모빌리티는 이동성, 연결성이라는 속성으로 인해 스마트 시티와 연계될 수밖에 없음
  • 스마트 시티 개발과 운영에 필요한 IoT 인프라와 디지털 트윈 기술부터, 여러 종류의 혁신 교통 수단과 인프라에도 주목할 필요가 있음
  • 인천공항은 CES2023에서 공항 실내를 그대로 메타버스로 구현한 스마트시티 미래상을 제시함
  • 현대그룹은 에어 택시 등 도심 항공 모빌리티(UAM: Urban Air Mobility) 기체 개발을 본격화하며, 국내 UAM 생태계 조성에 박차를 가할 계획

 


무선 가치 실현을 위한 앰비언트 컴퓨팅

앰비언트 컴퓨팅(Ambient Computing)

  • AI 기반의 IoT 기기 장비가 집 인테리어에 자연스럽게 녹아, 평소 컴퓨터가 어디에 있는지도 인지하기 어려운 상태
  • 다양한 장치들이 네트워크를 통해 유기적으로 동작하게 됨을 뜻하는 유비쿼터스 컴퓨팅에서 한 단계 발전한 용어
  • 앰비언트 컴퓨팅을 실행하는 기기는 자체적으로 축적한 데이터를 토대로 고객의 상황과 상태를 판단하고, 필요한 작업을 조용히 수행

 

사례

  • 구글, 아마존 등 글로벌 빅테크들이 선도
  • 삼성은 calm technology라는 청사진을 제시하고, 이를 구현할 수 있도록 기존의 스마트싱스 기반의 서비스들을 발전시킨 SmartThings Home Life를 선보임
  • LG전자는 ‘업(UP) 가전’을 내세워 고객의 사용패턴을 빅데이터로 분석하여, 고객의 니즈와 페인포인트를 만족하는 맞춤형 서비스를 제공하고자 함
  • LG전자는 멀티모달 인터페이스 개발에 주력하고 있으며, 향후 이를 가전에 접목해 앰비언트 컴퓨팅을 실현하겠다는 계획

⇒ 가트너는 2025년까지 기업의 60%가 5개 이상의 무선 기술을 동시에 사용할 것으로 전망

 


지속가능성

ESG

  • 환경(Environment) + 사회(Social) + 지배구조(Governance)
  • 기업 가치를 지속 가능하게 만드는 모든 기술과 솔루션을 활용하는 것이 ESG 경영이라 할 수 있음
  • 지속가능한 기업 가치란 환경, 기업에 관여하는 사람들, 그리고 기업 자체를 모두 포함함
  • 2023년부터는 여러 국가에서 발표한 ESG 관련 가이드라인이 본격적으로 시행될 예정임

 

카카오 화재

  • 안산에 데이터 센터를 준공할 예정
  • 탄소 배출 감축, 에너지 사용량 절감, 신재생 에너지 설비 도입 등의 친환경 사업을 센터에 적용할 전망
  • 리스크 모니터링은 기업의 지속가능성에 중요한 역할을 함

⇒ 가트너는 2023년 AI, SW를 활용해 이상 징후로부터 응용 프로그램과 서비스를 보호하는 디지털 면역 체계가 고려될 것이라는 전망을 발표

 


결론

  • 2023년 가트너가 제안한 메인 기술 트렌드는 지속 가능성
  • 경제가 혼란스러운 상황인 만큼 과감하게 투자를 하거나 비즈니스 모델을 혁신적으로 전환하는 기업은 이전보다 나타나기 어려울 것
  • 이러한 환경에서 기업들은
    • IT 서비스의 효율성을 높이고
    • 추적 및 분석, AI와 같은 기술을 통해 기업의 지속 가능성을 실현하며
    • 고객이 지속 가능성 목표를 달성할 수 있도록 IT 솔루션을 배치하는 등 효율적인 운영과 고도화에 집중해야 할 것

네이버의 해외 C2C 사업

  • 북미 개인간거래(C2C) 플랫폼인 포시마크를 인수
    스페인 중고거래 플랫폼인 왈라팝에 투자
    국내 명품 한정판 거래 플랫폼인 크림과, 일본 패션 플랫폼 빈티지 시티를 운영 중
    프랑스 명품 중고 거래 플랫폼 베스티에르 콜렉티브와 싱가포르 중고 거래 플랫폼 캐러셀 등의 기업에 지속적인 투자

 C2C, 특히 해외 시장에서 사업을 계속해서 확장하는 중. 왜?

  • 네이버가 국내와 해외에서 처한 상황은 완전히 다름
  • 해외에서는 커머스에 도전하는 수많은 기업 중 하나일 뿐
  • 커머스 분야에서 해외로 진출할 때 가장 큰 허들은 해당 지역의 이용자를 확보하는 일
  • C2C 플랫폼에 투자 혹은 인수하여 해당 플랫폼의 판매자, 유통 채널, 트래픽 등을 확보

 

금융권의 '게이미피케이션'

  • 최근 금융 앱에 ‘게이미피케이션’을 도입하는 사례가 늘고 있음
  • 화면 구성을 심플하게, 고객이 재미있게 투자할 수 있도록 게임 요소를 삽입
  • 영국 금융행위감독청은 이것이 유사 도박 행위처럼 될 수 있으니 규제해야 한다고 주장
  • 핀테크를 중심으로 거래 체결 축하 메세지, 리워드 제공 등 게이미피케이션과 긍정적 강화 기법을 활용한 금융 앱들이 사용자들에게 호평을 받고 있음
  • 그런데 이런 요소들이 고객을 중독시키는 도박과 같다면, 어디까지가 건전한 게이미피케이션인 걸까?

 

"AI 인턴" 채용

  • 미국의 한 마케팅 에이전시가 AI 인턴을 두 명 채용
  • 디자인과 콘텐츠 편집을 하며, 이름과 얼굴도 있음
  • 경험이 없는 직원이 제공할 수 있는 것과 동일한 수준의 양질의 작업을 생성할 수 있음
  • 연봉 6만 달러 이상 받는 직원이 하루 걸려 하는 일을 무려 5분 만에 할 수 있다고 함

 

LG 전자 무선 TV

  • 무선 TV가 세게 최대 가전/IT 전시회 CES 2023의 공식 어워드에서 최고 제품으로 선정
  • 화면 주변에 전원을 제외한 모든 선을 없애 TV 주변 공간을 깔끔히 함
  • 세계 최초로 4K, 120Hz 무선 전송 솔루션을 탑재
  • TV와 약 10m 떨어진 곳에서도 고화질 영상과 소리를 안정적으로 전달하는 무선 전송 기술
  • ‘제로 커넥트 박스’ 는 다양한 주변 기기를 연결할 수 있는 AV 전송박스
  • 독자 기술로 완성한 무선 AV 전송 솔루션은 기존 와이파이6 대비 최대 3배 이상 빠른 속도로 대용량 데이터를 전송 가능
  • 박스를 놓는 위치에 따라 안테나의 송신 방향을 조절할 수 있음
  • 장애물을 실시간으로 인식하고 최적의 전파 송/수신 경로를 설정해주는 알고리즘을 탑재
    → TV 본체와 박스 사이에 사람이 움직이며 전파를 가로막아도 부드러운 영상을 즐길 수 있음
[관련 포스팅 이동]
함수형 프로그래밍(Functional Programming)
절차지향 프로그래밍(Procedural Programming)
객체지향 프로그래밍(Object-Oriented Programming)

 

개요

정의 및 특징

  • 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론
  • 개발을 하는 방법론의 차이이지, 특정 언어가 특정 방식만 지원한다는 것은 아님
  • 객체 지향이 절차 지향의 반대인 것이 아님

 

프로그래밍 패러다임의 종류

  • 명령형 프로그래밍: ‘무엇’을 할 것인지를 나타내기보다 ‘어떻게’ 할 것인지를 설명하는 방식
    • 절차지향: 수행되어야 할 순차적인 처리 과정을 포함하는 방식(C, C++)
    • 객체지향: 객체들의 집합으로 프로그램의 상호작용을 표현(C++, Java, C#)
  • 선언형 프로그래밍: ‘어떻게’ 보다는 ‘무엇’을 할 것인지를 설명하는 방식
    • 함수형: 순수 함수를 조합하고 SW를 만드는 방식(클로저, 하스켈, 리스프)

 

패러다임의 변화

  1. 순차적 프로그래밍(goto)
    • 원시타입 데이터와 for, while 만으로 순차적으로 프로그래밍
    • 함수가 없기 때문에 특정 구간을 반복하려면 goto를 이용해 실행 순서 변경
  2. 절차적 프로그래밍(c언어)
    • 함수가 등장하여, 실행순서를 바꾸는 것이 아니라 반복적인 코드를 따로 보관
    • 함수 단위로 코드를 분리하고 재사용하는 형태의 프로그래밍
  3. 구조체 등장(c언어)
    • 관련 데이터를 그룹으로 묶어 관리하는 구조체 등장
  4. 객체 지향 프로그래밍_v1(c++)
    • 데이터만 묶는 것보다 관련 함수까지 같이 묶는게 더 편함 → class 등장
    • 클래스를 상속해 재사용하며 객체 지향 프로그래밍의 개념 시작
  5. 객체 지향 프로그래밍_v2(java)
    • 다량의 객체를 쉽고 효율적으로 만들 필요성을 느낌
    • 작은 부품(객체)를 미리 만들어두어 조립/결합하는 방식으로 개발하자는 진정한 객체 지향 프로그래밍의 개념 정립
    • 자바의 클래스는 c++의 클래스보다 추상화, 캡슐화, 상속, 다형성 관련 기능이 더 추가됨

 

언어별 패러다임

  • 특정한 패러다임을 지원하는 언어(자바)
    • jdk 1.8 이전: 객체 지향 프로그래밍만 지원
    • jdk 1.8 이후: 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입(함수형) 스트림같은 표준 API 추가(선언형)
  • 여러 패러다임을 지원하는 언어(C++, 파이썬, 자바스크립트)
  • JS는 단순하고 유연한 언어로, 함수가 일급 객체이기 때문에 객체지향보다는 함수형 방식이 선호됨

 


References

개요

정의

  • OOP(Object-Oriented Programming)
  • 객체들의 집합으로 프로그램의 상호 작용을 표현하며 데이터를 객체로 취급하여 객체 내부에 선언된 메서드를 함께 활용하는 방식
  • 모든 객체는 내부에 자료형(Field)와 함수(Method)가 존재함
  • 절차지향에서도 함수 재활용은 가능하지만 코드 수정 시 영향 범위를 예상하기 어려웠음
  • JAVA, C++, C#, Python 등이 이에 속함

 

장점

  • 모듈화, 캡슐화로 인해 유지보수가 용이
  • 상속을 통한 코드의 재사용성 증가
  • 객체 지향적이기 때문에 현실 세계와의 유사성에 의해 자연적인 모델링이 가능
  • 클래스 단위로 모듈화하여 독립적인 객체를 사용함으로써 개발의 생산성 향상

 

단점

  • 설계에 많은 시간이 소요되며 다른 패러다임에 비해 처리 속도가 느림
  • 객체가 많아지면 용량이 커질 수 있음

 


4가지 특성

추상화(abstraction)

  • 객체에서 공통된 속성과 기능을 추출하여 정의하는 것
  • 불필요한 정보는 숨기고 중요한 정보만을 표현함
  • 클래스 정의 시 메소드와 속성만 정의한 것을 인터페이스라고 부름

 

캡술화(encapsulation)

  • 변수와 함수를 클래스로 묶어놓은 것을 의미
  • 접근 제어자를 통한 정보 은닉 → 높은 응집도, 낮은 결합도를 유지
    • 결합도: 어떤 기능을 실행할 때 다른 클래스나 모듈에 얼마나 의존적인가
  • 한 곳에서 변화가 일어나도 다른 곳에 미치는 Side Effect를 최소화시킴

 

상속(inheritance)

  • 상위 클래스의 특성을 하위 클래스가 이어받아 재사용하거나 추가, 확장하는 것
  • 코드의 재사용 측면, 계층적인 관계 생성, 유지 보수성 측면에서 중요
  • 엄밀히 따지면 상속은 자식 클래스를 외부로부터 은닉하는 캡슐화의 일종임

 

다형성(polymorphism)

  • 서로 다른 클래스의 객체가 같은 동작 수행 명령을 받았을 때, 각자의 특성에 맞는 방식으로 동작하는 것
  • 코드를 간결하게 해주고 유연함을 갖추게 해줌
  • 다형성의 대표적인 예로 오버로딩, 오버라이딩이 있음
    • 오버로딩: 같은 이름을 가진 메서드를 여러 개 두는 것
    • 오버라이딩: 상위 클래스로부터 상속받은 메서드를 하위 클래스가 재정의하는 것

 


객체 지향 설계 원칙

  • 객체지향 프로그래밍을 설계할 때에는 SOLID 원칙을 지켜야 함
  • S: 단일 책임 원칙
  • O: 개방-폐쇄 원칙
  • L: 리스코프 치환 원칙
  • I: 인터페이스 분리 원칙
  • D: 의존관계 역전 원칙

 

SRP(Single Responsibility Principle)

  • 하나의 클래스는 하나의 책임만 가져야 함
  • 정확히는, 모듈이 변경되는 이유가 한가지여야 함
  • 지키지 않을 경우, 한 변경에 의해 다른 책임과 관련된 코드에도 영향이 갈 수 있음
  • 제대로 지킬 경우, 변경이 필요할 때 수정할 대상이 명확해짐

 

OCP(Open Closed Principle)

  • 확장에는 열려있으나 변경에는 닫혀 있어야 함
  • 확장에 열려 있다: 요구사항이 변경될 때 새로운 동작을 추가하여 기능을 확장할 수 있음
  • 변경에 닫혀 있다: 기존의 코드를 수정하지 않고 동작을 추가하거나 변경할 수 있음

⇒ 기존의 코드는 변경하지 않으면서도 확장은 쉽게 할 수 있어야 함

 

LSP(Liskov Substitution Principle)

  • 올바른 상속 관계의 특징을 정의하기 위한 원칙
  • 부모 객체를 자식 객체로 치환해도 시스템이 정상적으로 동작해야 함
  • 자식 클래스가 부모를 대체하기 위해서는 부모 클래스에 대한 클라이언트의 가정을 준수해야 함
  • 여기서 대체 가능성을 결정하는 것은 해당 객체를 이용하는 클라이언트임

 

ISP(Interface Segragation Principle)

  • 목적과 관심이 각기 다른 클라이언트가 있다면 인터페이스를 통해 적절하게 분리할 필요가 있음
  • 즉 클라이언트의 목적과 용도에 적합한 인터페이스만을 제공하는 것
  • 모든 클라이언트는 관심에 맞는 인터페이스만을 접근하여 불필요한 접근을 최소화할 수 있음
  • 기존 클라이언트에 영향을 주지 않은 채로 유연하게 객체의 기능을 확장/수정 가능

 

DIP(Dependency Inversion Principle)

  • 고수준 모듈은 저수준 모듈의 구현에 의존해서는 안되고, 저수준 모듈은 고수준 모듈에서 정의한 추상 타입에 의존해야 함
  • 변하기 쉬운 것에 의존하던 것을 추상화된 인터페이스나 상위 클래스를 두어 변하기 쉬운 것의 변화에 영향받지 않게 하는 원칙
  • 예를 들어, 타이어를 갈아끼울 수 있는 틀을 만든 후 다양한 타이어를 교체할 수 있어야 함
  • 즉 상위 계층은 하위 계층의 변화에 대한 구현으로부터 독립해야 함

 


References

개요

정의

  • Procedure(프로시저)를 이용하여 작성하는 프로그래밍 스타일
    • 프로시저란 반환값이 없고 실행이 주가 되는 함수라고 생각하면 됨
  • 반복되는 동작을 재사용 가능한 프로시저 단위로 나눈 프로그래밍
  • C, ALGOL, COBOL, FORTRAN 등이 이에 속함

 

장점

  • 컴퓨터의 처리 구조와 유사해 실행 속도가 빠름
  • 프로그램의 흐름을 쉽게 추적할 수 있음

 

활용

  • 계산이 많은 작업 등에 사용됨
  • 대표적으로 fortran을 이용한 대기 과학 관련 연산 작업, 머신 러닝의 배치 작업 등이 있음

 

단점

  • 코드 간 유기성이 매우 높아 모듈화하기가 어렵고 유지보수성이 떨어짐
  • 정해진 순서대로 입력을 해야하므로 순서가 바뀌면 결과값을 보장할 수 없음
  • 코드가 길어질수록 가독성이 떨어짐
  • ‘책’이라는 자료형과 책에 대한 함수가 있을 때, 둘의 연관 여부를 한 번에 알아차리기 어려움. 논리적으로 묶여있을 수 없는 구조이기 때문
    → 객체 지향 프로그래밍 등장

 


References

개요

정의

  • 선언형 프로그래밍(declarative programming)이란 ‘무엇을’ 풀어내는가에 집중하는 패러다임
  • 함수형 프로그래밍(functional programming)은 선언형 패러다임의 일종
  • 명령형과 함수형에서 사용하는 함수는 부수효과의 유무에 따라 차이가 있음
  • 대입문이 없는 프로그래밍 방식으로, 작은 문제를 해결하기 위한 함수를 작성
  • 작은 ‘순수 함수’들을 블록처럼 쌓아 로직을 구현하고 ‘고차 함수’를 통해 재사용성을 높인 프로그래밍 패러다임

 

장점

  • 더 나은 모듈화와 짧은 코드를 제공하여 함수 단위의 코드 재사용이 수월함
  • 불변성을 지향하기 때문에 프로그램의 동작을 예측하기 쉬움 → 테스트와 디버깅이 용이함
  • 가독성이 높은 코드를 작성하기 쉬움
  • 부수효과를 제거할 수 있음

 

단점

  • 함수형 프로그래밍의 개념을 이해하기가 쉽지 않음
  • 프로그래밍을 진행하며 수 많은 함수들을 파악하고 유지 관리하기 힘들어짐
  • 광범위한 환경 설정이 필요할 수 있음
  • 함수가 많아질수록 함수를 조합하기 복잡해지며 꾸준한 리팩터링이 필요할 수 있음
  • 반복이 for문이 아닌 재귀를 통해 이루어지는데, 재귀적 코드 스타일은 무한 루프에 빠질 수 있음

 


특징

부수 효과가 없는 순수 함수1급 객체로 간주하여 파라미터나 반환값으로 사용할 수 있으며, 참조 투명성을 지킬 수 있음

부수 효과(Side Effect)

  • 부수효과란 다음과 같은 변화 또는 변화가 발생하는 작업을 의미
    • 변수의 값이 변경됨
    • 자료 구조를 제자리에서 수정함
    • 객체의 필드값을 설정함
    • 예외나 오류가 발생하며 실행이 중단됨
    • 콘솔 또는 파일 I/O가 발생함

 

순수 함수(Pure Function)

const pure = (a, b) => {
	return a + b
}
  • 위와 같은 부수 효과를 제거한 함수로, 출력이 입력에만 의존함
  • 만약 다른 전역 변수가 출력에 영향을 주면 더이상 순수 함수가 아니게 됨
  • 장점
    • 함수 자체가 독립적이며 side effect가 없으므로 Thread에 안정성을 보장받음
    • thread-safe하여 병렬 처리를 동기화없이 진행 가능
    • 프로그램의 변화 없이 입력 값에 대한 결과를 예상할 수 있어 테스트가 용이

 

고차 함수(Higher Order Function)

  • 함수가 함수를 값처럼 매개변수로 받아 로직을 생성할 수 있는 것
  • 고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야 함

 

1급 객체(First-Class Object)

  • 일급 객체란 다음이 가능한 객체
    • 변수나 메서드에 함수를 할당할 수 있음
    • 함수 안에 함수를 매개변수로 담을 수 있음
    • 함수가 함수를 반환할 수 있음
  • 함수형 프로그래밍에서 함수는 1급 객체로 취급받기 때문에 함수를 파라미터로 넘기는 등의 작업이 가능

 

참조 투명성(Referential Transparency)

  • 동일한 인자에 대해 항상 동일한 결과를 반환해야 함
  • 참조 투명성을 통해 기존의 값은 변경되지 않고 유지됨

 


References

접근

알고리즘 분류를 봤더니 두 포인터 말고도 이분탐색이 함께 있는걸 알게됐다. 두 방법 모두로 풀 수 있으며, 시간 효율은 이분탐색이 O(N^2logN), 투포인터가 O(N^2)로 투포인터 방식이 더 효율적이다. 투포인터의 경우에는 하나의 용액을 고정한 뒤 나머지 두 용액의 값을 투포인터로 찾는 방식이고, 이분탐색의 경우에는 두 개의 용액을 고정한 뒤 나머지 하나의 값을 이분탐색으로 찾는 방식이다. 이 문제에서 주의할 점은, 세 용액을 합했을 때 그 값이 최대 1,000,000,000 * 3으로 int의 범위를 넘어갈 수도 있다는 점이다. 따라서 최소가 되는 절댓값을 비교할 때 int가 아니라 long에 저장을 해야 한다. 

 

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    static long MAX_VALUE = (long)1000000000 * 3;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        // 입력값 저장
        int n = Integer.parseInt(br.readLine());
        int[] arr = new int[n];
        int[] answer = new int[3];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++)
            arr[i] = Integer.parseInt(st.nextToken());
        Arrays.sort(arr);

        // 투 포인터 적용
        long minSum = MAX_VALUE;

        for (int i = 0; i < n-2; i++) {
            int left = i + 1, right = n-1;

            while(left < right) {
                long sum = (long)arr[i] + arr[left] + arr[right];

                if (Math.abs(sum) < minSum) {
                    minSum = Math.abs(sum);
                    answer[0] = arr[i];
                    answer[1] = arr[left];
                    answer[2] = arr[right];
                }

                if(sum == 0) break;
                else if (sum < 0) left++;
                else right--;
            }
        }

        for (int i = 0; i < 3; i++)
            System.out.print(answer[i] + " ");
    }
}

'Algorithm' 카테고리의 다른 글

[백준] 1946: 신입 사원 JAVA  (0) 2023.01.28
[백준] 16953: A → B JAVA  (0) 2023.01.28
[백준] 1253: 좋다 JAVA  (0) 2023.01.18
[백준] 2467: 용액 JAVA  (0) 2023.01.18
[백준] 2531: 회전 초밥 JAVA  (0) 2023.01.15

+ Recent posts