Code.presso Java 웹 개발 트랙 체험단 활동 2주차 두번째 코스로 수강한 강의는
Java Programming에 관한 내용이다.

그 중 오늘은 객체지향의 기초 개념으로, 클래스, 메소드, 접근제어자, 생성자, 메소드 오버로딩에 대해 정리해보려고 한다.

강의 제목은 "Java Programming 초급" 으로, 자세한 정보는 👇🏻아래👇🏻 링크를 통해 확인할 수 있다.

📌 Java Programming 초급 - 강의 정보

✋🏻 포스팅 내 사용된 사진 파일들의 저작권은 모두 코드프레소에 있으며, 강의자료 공유 및 업로드는 불가능합니다.


🏷 객체지향 기초 개념

✔️ 객체지향이란?

객체 지향 프로그래밍(Object Oriented Programming) 이란, 데이터와 데이터에 대한 연산을 수행하는 코드를 그룹화 한 객체를 중심으로 소프트웨어를 설계/개발하는 패러다임이다.

시스템의 행위보다, 시스템에 참여하고 책임을 가지는 객체가 무엇인지에 주목한다.

다수의 객체가 각자의 역할을 가지고이쏙, 객체 간에는 메시지를 주고 받으면서 전체 시스템을 구성한다.


✔️ 절차지향 vs 객체지향

커피숍을 운영한다고 가정했을 떄, 어떠한 관점에서 업무를 설계하느냐에 따라 업무의 효율이 달라질 수 있다.

소프트웨어 또한 마찬가지로, 무엇을 중심에 두고 설계를 하는 지가 중요한데 이를 절차 지향객체 지향으로 나누어 볼 수 있다.

이러닝 시스템을 설계하고 있다고 가정해보자!

  1. 절차 지향
  • 시스템의 행위에 집중한다.
  • 강의 수강 기능/강의 구매 기능을 하는 함수를 각각 설계하고 구현한다.
  1. 객체 지향
  • 시스템에 참여하는 요소들에 집중한다.
  • 강사 객체/수강생 객체 각각이 어떤 속성을 가지고 어떤 기능을 하는지 고려하여 설계하고 구현한다.

객체지향 프로그래밍의 장점

  1. 복잡한 소프트웨어 시스템이 역할/책임에 따라 모듈화 될 수 있다.
  2. 소프트웨어 구성 요소 간의 더 명확한 커뮤니케이션이 가능해진다.
  3. 결과적으로 소프트웨어를 더 쉽게 유지보수 할 수 있다.

🏷 추상화와 클래스 개념

✔️ 클래스

클래스는 Java 프로그램의 기본단위로, Java 프로그램은 한 개 이상의 클래스로 구성된다.
(+ 일반적으로 1개의 클래스는 1개의 Java 파일을 가진다.)

객체라는 것은 쉽게 말해 사물이다.
클래스는 특정 객체를 어떻게 생성할 지에 대한 정보를 가지 고 있는 설계도로, 클래스는 객체를 만들기 위한 틀 또는 템플릿 이라고 볼 수 있다.

각각의 객체는 속성과 행동을 가지고 있다.
사진과 같이 각각의 데이터는 속성을, 메소드는 행동을 나타낸다.


✔️ 추상화

구체적❓

  • 눈에 보이는 것, 만질 수 있는 것
  • 많은 정보를 포함하고 있다.

추상적❓

  • 상상은 가능하지만 확실한 형상이나 개념을 떠올리기 어렵다.
  • 꼭 필요한 정보만 있다.

추상화💡

  • 반드시 필요한 것들만 선택하고 불필요한 것들을 버리는 과정이다.
  • 추상화의 과정 자체가 하나의 클레스를 설계하는 과정이다.
    ➡️ 즉, 구체적인 정보에서 관심을 가지지 않아도 되는 것을 다 버리고 정말 필요한 정보만 남기는 것이 추상화이고 클래스를 설계하는 과정이다.

✔️ 좋은 클래스란?

좋은 클래스에 대한 이야기는 설계에 관련된 이야기이고, 고급 레벨이지만 그래도 간단히 정리해보자면!

  1. 꼭 필요한 최소한의 속성과 행위만 존재한다.
  2. 속성과 행위 모두 특정 객체와 높은 관련성이 있어야 한다
  3. 너무 큰 규모의 클래스는 분할될 필요가 있다.

🏷 Java 클래스 선언과 객체 생성

✔️ 클래스 선언

1. 클래스 문법

  • class 키워드가 사용된다.
  • 클래스 이름을 선언하고 클래스 내부 구현코드를 중괄호로 묶는다.
  • 클래스 내부에는 변수들과 메소드들이 존재한다.
    - 변수는 멤버 변수와, 인스턴스 변수가 있다.
    • 메소드는 메소드와, 인스턴스 메소드가 있다.

2. 클래스 이름

  • 클래스의 이름은 주로 명사를 사용한다.
  • 대문자로 시작하며 단어가 연결될 경우 각 단어의 첫 문자를 대문자로 표시한다.
  • 이름은 의미있는 이름으로 작명해야 한다.

✔️ 객체 생성

클래스로부터 객체를 생성할 수 있다.
➡️ [클래스명] [변수명] = new [클래스명]();

  • 객체를 생성하고 그 객체에 대한 참조 정보를 변수에 저장한다.

✔️ 객체의 멤버 변수 접근

. 연산자로 객체의 멤버에 접근이 가능하다.
➡️ [객체 참조 변수명].[멤버 변수명]

  • 객체의 멤버 변수에 새로운 값을 저장할 수도 있다.
  • 객체의 멤버 변수에 저장되어 있는 값을 가져올 수도 있다.

이와 같이 하나의 클래스를 기반으로 다수의 독립적인 객체를 생성하고 멤버 변수에 접근할 수 있다!


🏷 메소드의 개념과 기초 활용

✔️ 메소드와 함수

1. 메소드
객체는 속성과 행위를 가지고있고, 메소드는 객체의 행위를 정의한다.
메소드는 함수와 거의 유사한 동작을 한다!
그러나 메소드는, 독립적으로 존재하지 않으며 특정 객체에 포함되어 있다!

2. 함수
함수는 특정한 작업을 수행하기 위한 코드들의 집합이다.
특정 작업의 코드들을 모듈화하여 필요한 경우 호출하며, 코드의 중복을 줄일 수 있다.

정리하자면❗️
메소드는, 특정 객체 내부에 존재하며, 객체의 멤버 변수에 대한 연산이 가능하고
함수는, 독립적으로 존재하며, 특정 작업에 필요한 데이터를 모두 제공해야 한다!


✔️ 메소드의 문법과 이름

1. 메소드의 문법
메소드를 호출하기 위한 메소드의 이름이 존재하고, 특정 작업을 위한 메소드의 구현 코드가 중괄호({}) 내부에 구현된다.

메소드는 InputOutput 이 존재한다.

  • Input 은 없거나, 1개 이상의 파라미터 리스트이다.
  • Output 은 없거나 리턴값으로 표시된다.
  • 리턴 타입은 리턴되는 값의 자료형으로, 없을 경우 void 로 표시한다.

2 . 메소드의 이름

  • 메소드의 이름은 행동을 표현하기 위해 보통 동사로 시작한다.
  • 첫 단어는 소문자로 시작하며, 2개 이상의 단어가 결합 될 경우 연결되는 단어의 첫 문자를 대문자로 표시한다.
  • 이름은 의미있는 이름으로 작명해야 한다.

🏷 접근 제어자의 개념 및 적용

✔️ 캡슐화의 2가지 의미

캡슐화에는 2가지 의미가 있다.

하나, 객체의 속성과 행동을 하나의 단위로 그룹화한다.
둘, 객체의 속성과 행동을 은닉한다.

  • 반드시 필요한 속성 및 행동만* 외부에 노출한다.
  • 대부분의 속성 및 행동은 외부에서 접근하지 못하도록 막는다.
    ➡️ 반드시 필요한 멤버만 외부에 노출하여 결합도를 줄일 수 있다.

✔️ Java 의 접근 제어자

Java의 접근 제어자를 활용하여 멤버의 접근을 제어할 수 있다
접근 제어자의 종류는 4가지가 있는데, 이번 강의에서는 publicprivate 만 알아보도록 하겠다.

  1. public
  • 모든 곳에서 접근이 가능하다.
  1. private
  • 외부에서 접근이 불가능하다.
  • private 멤버도 객체 내부에서는 접근 가능하다.
  • 보통 모든 멤버 변수는 private 으로 지정
  • 외부에 반드시 노출이 필요한 메소드만 제외하고, 객체 내부에서만 활용되는 메소드도 private 으로 지정한다.

✔️ 접근 제어자의 사용

  1. 클래스, 멤버 변수, 메소드에 활용된다.

  2. 클래스는 class 키워드 앞에 명시한다.
    ➡️ public class User

  3. 멤버 변수는 자료형 앞에 명시한다.
    ➡️ private String email;

  4. 메소드는 리턴 타입 앞에 명시한다.
    ➡️ public boolean isOver20()


✔️ 접근 제어자의 활용

만약 private 멤버 변수의 값을 변경하거나 사용하고 싶을 때는 어떻게 할까🧐❓

  1. 생성자로 객체 멤버 변수 값을 초기화
  2. setter 메소드로 객체 멤버 변수의 값을 변경
  3. getter 메소드로 객체 멤버 변수의 값을 사용

🏷 메소드의 리턴 값과 파라미터

✔️ 메소드 파라미터(매개변수)의 활용

  • 파라미터는 메소드의 input 데이터를 받는 변수이다.
  • 없거나 1개 이상의 파라미터가 존재할 수 있다.
  • 메소드 이름 뒤에 위치하며, 소괄호내부에 [자료형][변수명] 쌍으로 표현할 수 있다.
  • , 로 분리하여 여러개의 파라미터를 선언할 수 있다.

✔️ this 키워드

그림곽 같이, 객체 내부에서의 this해당 객체 자신을 의미한다.

만약 변수의 이름이 중복되지 않느 경우 this 로 명시하지 않아도 되지만,
파라미터 이름을 의미있게 만들면, 멤버 변수와 파라미터 이름이 보통 중복된다.


✔️ Setter 메소드

멤버 변수의 값을 저장(변경)하는 Setter 메소드에 대해 알아보자.
보통 1개의 멤버 변수의 값을 세팅하는 메소드는 set 이라는 동사로 시작하며, setter 라고 지칭한다.

이와 같이 setter 를 호출하여 객체의 멤버 변수 값을 저장하고 변경할 수 있다.

📌 인자(argument) vs 파라미터(parameter)

  • 전달하는 쪽이 인자
  • 받는 쪽이 파라미터

✔️ 메소드 리턴 값

  1. 메소드는 수행 결과를 값으로 반환한다.
    ➡️ return 키워드를 사용하며, return 을 만나면 메소드는 값을 반환하고 종료된다.

  2. 메소드 내에 1개 이상의 return 문을 사용할 수 있다.

  3. 메소드에는 리턴하는 값의 자료형을 명시해야 한다.

  4. 또한, 리턴 값이 없는 경우도 존재한다(void).

📌 Getter & Setter 생성 단축키
mac 기준 command + N 단축키를 통해 간단하고 쉽게 생성할 수 있다.


🏷 생성자의 활용

생성자(Constructor)객체가 생성되는 시점에 호출되는 특별한 형태의 메소드로,
객체가 생성되는 시점에 초기화를 하기 위해 사용된다.

주로 객체 멤버 변수의 초기화 작업을 하는데, 멤버 변수를 명시적으로 초기화 하지 않은 경우에는

  • 숫자형 변수 = 0
  • 불리안 변수 = false
  • 참조 변수 = null

으로 저장된다.


✔️ 생성자의 문법

  • 생성자의 이름은 클래스의 이름과 동일하다.
  • 대다수가 보통 public 을 사용한다.
  • 0개 또는 1개 이상으 ㅣ파라미터로 선언 가능하다.
  • 리턴 타입은 생략된다.

📌 Default 생성자
생성자를 명시적으로 추가하지 않은 경우 Default 생성자를 제공한다.
(1개 이상의 생성자를 명시적으로 구현한 경우는 제외)
현재까지 우리는 이러한 형태로 Default 생성자를 사용해 왔다!


✔️ 파라미터가 있는 생성자

사진과 같이 모든 멤버 변수의 값을 인자로 전달받아 초기화 하는 생성자를 파라미터가 있는 생성자라고 한다.
객체 생성과 함께 전달하는 인자 값으로 객체의 멤버 변수를 초기화한다.

파라미터 개수를 조절하여 멤버 변수의 일부만 초기화 할 수도 있다.

주의✋🏻, 생성자를 구현하는 경우 Default 생성자는 사용할 수 없다


🏷 메소드 오버로딩

개발을 진행하다보면, 같은 작업을 하지만 파라미터만 다른 메소드가 필요한 경우가 있다!
이런 경우에 메소드 오버로딩을 적절히 사용하면 원하는 결과를 얻을 수 있다😉

메소드 오버로딩이란, 특정 클래스 안에서 파라미터가 다른 동일한 이름의 메소드를 선언하는 것이다.

파라미터의 자료형 또는 개수가 다르면, 동일한 이름을 사용할 수 있다.
메소드 호출 시 파라미터 세팅 조건에 따라 호출되는 메소드가 결정된다.

단, 리턴 타입은 메소드 오버로딩의 조건에 해당하지 않으니 주의하자!


✔️ 메소드 오버로딩 예시

1. 적합한 예시🙆🏻‍♀️
첫번째와 두번째, 두번째와 세번째는 파라미터의 개수가 다르기 때문에 메소드 오버로딩을 사용할 수 있다.
첫번째와 세번째는 파라미터의 개수는 같지만 자료형이 다르기 때문에 이 경우에도 메소드 오버로딩을 사용할 수 있다.

2. 부적합한 예시🙅🏻‍♀️
첫번째와 두번째는 파라미터의 개수와 자료형이 모두 같기 때문에 메소드 오버로딩이 불가능하다.
첫번째와 세번째, 두번째와 세번째의 경우에도 같은 이유로 메소드 오버로딩이 불가능하다.

리턴타입은 같아도, 같지 않아도 메소드 오버로딩의 조건에 해당되지 않는다는 것을 명심하자!!


✔️ 생성자 오버로딩

생성자도 특수한 형태의 메소드이기 때문에 오버로딩을 적용할 수 있다.

이와 같이 초기화를 원하는 멤버 변수만 선택해서 초기화를 할 수 있다.

그 결과, 객체 생성 시 세팅하는 파라미터의 조합에 따라 서로 다른 생성자가 호출되는 것을 확인할 수 있다.


이렇게 Code.presso Java 웹 개발 트랙 체험단 활동 2주차 두번째 코스도 시작되었다!

코드프레소 홈페이지(https://www.codepresso.kr/)에는 오늘 포스팅한 객체지향의 기본 개념 관련 강의뿐만 아니라 다양한 강의들이 개설되어 있으니 모두 한번 씩 살펴보고 수강해보면 좋을 것 같다😃

profile
Backend Developer

0개의 댓글