객체란 무엇인가? 컴퓨터적 시선에서 설명하면 무언가를 표현하기 위해, [상태(데이터)]와 [행동(기능)]을 하나로 묶어놓은 단위를 말한다 ex) 속성 (Attribute / 변수-데이터): 색상, 속도, 차종, 모델명, 가격 등 기능 (Method / 함수-기능): 출발하기, 정지하기, 가속하기 객체지향 프로그래밍 (Object Oriented)방식 : 데이터(변수)와 기능(함수)을 하나의 '객체' 단위로 묶어서 관리. 장점: 관련된 데이터와 함수를 한곳에 묶어 유지보수가 쉽고 구조가 명확해짐 클래스란 무엇인가? 앞서 '객체'가 실제로 만들어진 물건이라면, 클래스는 그 물건을 어떻게 만들지 적어놓은 설명서라고 보면 된다. 예를 들어 '클래스 = 붕어빵 틀'이라하면 객체는 그 틀로 만들어진 실제 붕어빵이다. 이런 걸 인스턴스라고 하는데, 인스터스란 현실의 객체를 소프트웨어 내에서 구현한 실체이다. 클래스 코드 안에는 딱 두 가지만 정의한다. 멤버 변수 (상태 / 데이터): 이 객체가 가져야 할 정보 멤버 함수 (기능 / 동작): 이 객체가 할 수 있는 행동 - 멤버함수의 생성자(Constructor) 객체가 생성 될 때 딱 한 번 자동으로 호출되며 변수를 초기화 해준다. - 생성자만의 2가지 특별한 규칙 ⚠️ 함수의 이름이 클래스 이름과 정확히 똑같아야 함! 반환 타입(void, int 등)을 절대로 적지 않음! 아래는 클래스의 기본 코드 형태이다. class Car { public: // [멤버 변수] string color; int speed; // ★ 이것이 바로 생성자! // 1) 이름이 클래스 이름(Car)과 완전히 동일함 // 2) 앞에 void나 int 같은 반환 타입을 안 붙임 Car() { color = "하얀색"; // 차가 생성될 때 기본 색상을 하얀색으로 세팅 speed = 0; // 차가 생성될 때 기본 속도를 0으로 세팅 cout << "새로운 자동차가 출고되었습니다!" << endl; } // [일반 멤버 함수] - 비교용 void accelerate() { speed += 10; } }; 아래는 위 차량 클래스를 바탕으로 찍어낸 자동차 객체 이다 int main() { // 설계도(Car)를 보고 실제 객체(myCar, friendsCar)를 만듦! // 여기서 'myCar'라는 객체를 생성하는 순간! // 개발자가 직접 호출하지 않아도 Car() 생성자가 '자동'으로 실행됨! Car myCar; Car friendsCar; // 내 차 설정 myCar.color = "빨강"; myCar.speed = 0; myCar.accelerate(); // 내 차 속도 +10 // 친구 차 설정 friendsCar.color = "파랑"; friendsCar.speed = 50; // myCar와 friendsCar는 같은 설계도로 만들어졌지만 // 서로 완전히 별개의 객체! } 아래 3가지는 c++에서 꼭 알아야할 주요 규칙이므로 잘 숙지해두자 1. 멤버 변수 초기화 위치 클래스 정의 내부에서 변수를 선언할 때는 메모리가 할당되지 않는다. 변수 초기화는 객체가 만들어질 때 호출되는 생성자 내부에서 진행해함 C++개념상 클래스는 단순한 설계도 느낌. 즉 메모리를 전혀 차지하지 않는다. 존재하지도 않는 메모리에값을 저장할 수는 없잖아? 2. 객체 생성 시 괄호() 사용 주의 (매우 중요!) 인수 없는 생성자 호출 시: Circle c1; 처럼 괄호 없이 선언해야 함. Circle c1(); 이라고 쓰면 C++ 컴파일러는 이를 객체 생성이 아닌 "함수 선언"으로 오인하여 컴파일 오류가 발생! 인수 있는 생성자 호출 시: Circle c1(5.0); 처럼 괄호 안에 값을 넣어 생성. Car myCar; // (O) 정답! "myCar라는 자동차 객체 하나 만들어줘!" Car myCar(); // (X) 에러! C++ 컴파일러: "어? 'myCar'라는 이름을 가진, Car를 반환하는 함수를 선언하는 건가?" 하고 오인함! Car myCar("빨강", 100); // (O) "빨간색, 속도 100짜리 차 만들어줘!" * 3. 객체 간 대입 연산자 (=) 복사 c1 = c2;와 같이 대입하면 c2의 멤버 변수 값들이 c1의 멤버 변수로 1:1 복사됨. 복사 후에도 c1과 c2는 메모리상 별개의 객체로 존재 . *
Stepping into the digital gaming landscape often brings confusion for new players who are unfamiliar with technical configurations and diverse user terms on the web. Many individuals hastily create accounts on random platforms, resulting in frustrating access blocks, slow customer support, or low-quality games with unfair matchmaking systems. To achieve a safe and highly satisfying experience, it is critical to pick an authorized website that guarantees transparent rules and data safety, and checking out a regulated platform is a fantastic choice for a protected gaming environment. The registration procedure is designed to be completed in less than three minutes, asking for minimal credentials and a swift email confirmation to unlock the user panel. Once your account is active, navigating the extensive library of thousands of legitimate games is simple https://beta-rino.com with intuitive filters that arrange software by provider or category. For a shallow start, trying the integrated free demo versions is the best method to explore game designs and bonus features without any real money involvement. Your support requests are verified by a professional team that regularly settles technical issues inside a single day using secure digital systems.
인프런 김영한 강사님의 스프링 핵심 원리 - 기본편의 섹션 2를 정리한 내용입니다. 객체 지향 프로그래밍이란? 컴퓨터 프로그램을 " 객체 "들의 모임으로 파악하고자 하는 것 각자의 " 객체 "는 메시지를 주고받고 데이터 처리가 가능 프로그램을 유연 하고 변경이 용이 하게 만들기 때문에 대규모 소프트웨어 개발에 많이 사용 유연하고 변경이 용이하다? 레고 블럭 조립하듯이, 부품을 갈아 끼우듯이 컴포넌트를 쉽고 유연하게 변경하면서 개발할 수 있는 방법 유연함과 변경이 용이하게 만드는 객체지향의 핵심은 바로 다형성 이다. 다형성이란? 실세계로 비유하자면, 운전자 - 자동차 예시 자동차가 바뀌어도 운전자에게는 영향을 주지 않음 왜? 자동차 라는 역할의 인터페이스는 바뀌지 않으니까. '운전자'가 자동차의 내부 구조를 몰라도, 내부 구조가 바뀌어도, '자동차'라는 역할의 인터페이스가 변하지 않았기 때문에 운전이 가능한 것 처럼 '클라이언트'도 대상 역할의 인터페이스가 변하지 않는다면 새로운 기능을 제공하여도 아무 문제가 없을 것이다. 핵심은 클라이언트이다. 클라이언트는 대상의 역할(인터페이스)만 알면 된다. 클라이언트는 구현 대상의 내부 구조를 몰라도 된다. 클라이언트는 구현 대상의 내부 구조가 변경 되어도 영향을 받지 않는다. 클라이언트는 구현 대상 자체를 변경 해도 영향을 받지 않는다. 즉, 구현보다 대상의 역할(인터페이스)이 더 중요하다. 역할(인터페이스)이 변하면 클라이언트, 서버 모두에 큰 변경이 발생하기 때문에 인터페이스를 안정적으로 잘 설계하는 것이 중요하다는 것이다. Spring과 객체 지향은 어떤 연관성일까? Spring은 IoC, DI 기능에서 다형성을 활용하여 이용할 수 있도록 지원한다. 또한, Spring과 객체 지향 설계를 제대로 이해하려면 다형성이 아닌 SOLID 라는 원칙을 알아야 한다. SOLID 원칙은 또 뭔데? SOLID란, 좋은 객체 지향 설계의 5가지 원칙을 정리한 것이다. SRP (Single Responsibility Principle) OCP (Open/Closed Principle) LSP (Liskov Substitution Principle) ISP (Interface Segregation Principle) DIP (Dependency Inversion Principle) SRP: 단일 책임 원칙 한 클래스 는 하나의 책임 만 가져야 한다. 하나의 책임이라는 것은 크고 작을 수 있고, 문맥과 상황에 따라 다르기에 모호한 표현. 중요한 기준은 변경 이다. 변경이 있을때 그에 따른 파급 효과가 적으면 SRP 를 잘 따른 것 OCP: 개방-폐쇄 원칙 소프트웨어 요소는 확장에는 열려 있으나, 변경에는 닫혀 있어야 한다. 이 원칙의 문제점이 있다. 구현 객체를 변경하려면 클라이언트 코드를 변경해야 한다. 위 자동차 예시를 들자면, 운전자에게 자동차를 아반떼 에서 소나타로 변경한다고 알려주어야 한다. 근데 이러면 변경한 것이 아닌가? 변경에는 닫혀 있어야 한다고 했는데.. 다형성을 사용했지만 OCP 원칙을 지킬 수 없는 것인데.. 위 문제를 해결하기 위해 객체를 생성 하고 관계를 맺어 주는, 별도의 설정자 가 필요하다. 이 원칙을 지키기 위해 Spring에서는 IoC, DI 라는 기능을 지원해주고 있다. LSP: 리스코프 치환 원칙 프로그램의 객체는 프로그램의 정확성 을 깨뜨리지 않으면서 하위 타입의 인스턴스 로 바꿀 수 있어야 한다. 자식 클래스는 언제나 부모 클래스를 대체할 수 있다는 원칙이다. 부모 클래스가 들어갈 자리에 자식 클래스를 넣어도 계획대로 잘 작동해야 한다는 것. 예시로, 자동차 인터페이스의 엑셀은 앞으로 가라는 기능이고, 이를 뒤로 가게 구현하면 LSP 위반인 것이다. 느리더라도 앞으로 가게 해야 한다. ISP: 인터페이스 분리 원칙 특정 클라이언트를 위한 인터페이스 여러 개 가 범용 인터페이스 하나 보다 낫다. 기능에 맞게 적당한 크기로 인터페이스를 잘게 쪼개 야 한다. 자동차 인터페이스 -> 운전 인터페이스, 정비 인터페이스 로 분리 사용자 클라이언트 -> 운전자 클라이언트, 정비사 클라이언트로 분리 위 예시에서, 정비 인터페이스 자체가 변해도 운전자 클라이언트에 영향을 주지 않는다. ISP를 통해 인터페이스가 더 명확해지고, 대체 가능성도 높아지는 결과를 불러온다. DIP: 의존관계 역전 원칙 프로그래머는 추상화에 의존해야지, 구체화에 의존하면 안된다. 자동차 예시로, 운전자는 자동차의 역할(인터페이스)에 대해 알아야 하지 아반떼나 소나타 같은 구현체를 알면 안된다. 인터페이스가 아닌 구현체를 알게 될 경우, 구현 대상이 바뀌면 운전자에 영향을 주기 때문에 다형성에 위배 된다. 변경이 아주 어려워진다는 의미이다. 정리 객체 지향의 핵심은 다형성 이다. 하지만, 다형성 만으로는 구현 객체를 변경할 때 클라이언트 코드도 함께 변경되기 때문에 OCP, DIP 를 지킬 수 없다. 하지만, 뒤에 배울 Spring은 DI 라는 기술을 통해 다형성 + OCP, DIP를 가능하게 지원해준다.