프로그래밍 언어/Java

Java 프로그래밍 초급(2) - 객체지향 메소드

pink_salt 2022. 1. 19. 03:48
728x90

안녕하세요~ 항상 나아가는 개발자 pink_salt 입니다!

코드프레소 Java 웹 개발 체험단 활동을 하고 있습니다.

Java의 정말 중요한 개념인 객체지향 그리고 메소드 대해서 알아봅시다~ 고고!

이번엔 'Java 프로그래밍 초급' 강의를 듣고 공부한 내용을 정리하여 두 번째 포스팅을 진행하겠습니다.


메소드의 개념과 기초 활용

 

메소드(Method)

  • 객체는 속성과 행위를 갖고 있고, 메소드는 객체의 행위를 정의합니다.
  • 메소드는 함수(function)과 거의 유사합니다.
    • input과 output이 존재하며 특정 작업을 수행합니다.
    • 차이점은 메소드는 특정 객체에 포함되어 있습니다.
      • 독립적으로 존재하지 않습니다.

 

함수(function)

  • 특정한 작업을 수행하기 위한 코드들의 집합입니다.
  • 특정 작업의 코드들을 모듈화 하여 필요한 경우 호출합니다.
  • 코드의 중복을 줄일 수 있습니다.
  • 프로시저, 서브루틴이라고도 합니다.


메소드 vs 함수

메소드 함수
메소드는 특정 객체 내부에서 존재합니다. 함수는 독립적으로 존재합니다.
객체의 멤버 변수에 대한 연산이 가능합니다. 함수는 특정 작업에 필요한 데이터를 모두 제공해야합니다.

 

메소드의 문법

  • 메소드를 호출하기 위한 메소드의 이름이 존재합니다.
  • 특정 작업을 위한 메소드의 구현 코드가 중괄호 {} 내부에 구현됩니다.
  • 메소드는 Input과 Output이 존재합니다.
    • Input은 없거나 1개 이상의 파라미터 리스트
    • Output은 없거나 리턴 값으로 표시
    • 리턴 타입은 리턴이 되는 값의 자료형을 말합니다.
      • 만약 리턴 값이 없을 경우에는 void를 씁니다.

메소드 문법

메소드의 이름

  • 메소드의 이름은 행동을 표현하기 위해 보통 동사로 시작합니다.
    • ex) print(), getUserInfo(), setPassword(), signUp()
  • 첫 단어는 소문자로 시작하며, 2개 이상의 단어가 결합될 경우 연결되는 단어의 첫 문자를 대문자로 표시합니다.
    • getUserInfo(), setPassword()
  • 메소드가 수행하는 작업을 의미 있게 표현하는 이름을 사용해야 합니다.

 

사용자 클래스 행동을 추가

 

이전에는 User 클래스에서 멤버 변수 4개만 존재했습니다.

사용자 클래스에 행동을 추가해보겠습니다.

영상 시청 시스템에는 이러한 행동들을 추가할 수 있습니다.

  • 사용자의 정보 출력
    • 그 전에는 main함수에서 출력을 하였지만 메소드를 만들어서 진행해보겠습니다.
    • NewTubeSystem.java
      이렇게 printInfo()라는 메소드를 만들었습니다.
    • 객체의 메소드를 호출하기 위해서는 점 연산자를 이용해야합니다.
      • 점 연산자(dot operator)로 객체의 멤버(메소드)에 접근이 가능합니다.
      • 필요한 경우 메소드의 인자(값)을 전달합니다.
      • 객체참조변수명.메소드명(인자)
        메소드 호출의 결과 값을 리턴 받아 사용 가능합니다.
      • 객체 메소드 호출 코드
         
      • 메소드는 별도의 데이터(인자)를 전달하지 않아도 객체의 멤버 변수를 활용하여 작업이 가능합니다.

접근 제어자의 개념 및 적용

객체지향에서 정말 중요한 것 중 하나가 캡슐화입니다. (Encapsulation)

캡슐화 의미

  • 객체의 속성과 행동을 하나의 단위로 그룹화
  • 객체의 속성과 행동을 은닉(Information Hiding)
    • 반드시 필요한 속성 및 행동만 외부에 노출합니다.
    • 대부분의 속성 및 행동은 외부에서 접근하지 못하도록 막습니다.

객체의 정보 은닉(Information Hiding)

  • 객체 내부에는 외부에서 접근해서 변경하면 안 되는 속성이 존재합니다.
    • 사용자 객체의 나이를 -10이나 100으로 변경한다면?
    • 사용자 객체의 비밀번호를 변경한다면?
    • 개념 상 이루어지면 안되는 위험한 형태입니다.
  • 반드시 필요한 멤버만 외부에 노출하여 결합도를 줄일 수 있습니다.
  • 객체 간의 관계의 양(결합도)을 조정하여야 좋은 설계를 만들 수 있습니다.

 

객체의 정보 은닉 방법

  • 접근 제어자(Access Modifier)를 활용하여 멤버의 접근을 제어합니다.
  • Java 접근 제어자의 종류

 

접근 제어자 설명
public 모든 곳에서 접근 가능합니다.
private 외부에서 접근 불가합니다.
protected 상속 관계에서 자식이 부모 멤버에 접근 가능합니다.
default 같은 패키지 내부에서만 접근 가능합니다. 접근 제어자 명시하지 않을 시 해당됩니다.

 

접근 제어자의 사용

  • 클래스, 멤버 변수, 메소드에 활용합니다.
  • 클래스는 class 키워드 앞에 명시합니다.
    • public class User
  • 멤버 변수는 자료형 앞에 명시합니다.
    • private String email;
  • 메소드는 리턴 타입 앞에 명시합니다.
    • public boolean isOver20()
  • 접근 제어자를 default로 두지 말고 반드시 적절하게 명시해야 합니다.

 

private 접근 제어자

  • private으로 지정된 멤버는 외부에서 접근 불가합니다.
  • private 멤버도 객체 내부에서는 접근 가능합니다.
  • 보통 모든 멤버 변수는 private으로 지정합니다.
    • 이때, 멤버 변수를 private으로 하면 데이터를 어떻게 쓰느냐에 대한 의문이 생깁니다.
    • public으로 지정한 메소드를 활용해서 멤버 변수를 사용할 수 있습니다.
  • 외부에 반드시 노출이 필요한 메소드만 제외하고, 객체 내부에서만 활용되는 메소드도 private으로 지정합니다.

 

접근 제어자는 섞어서 쓸 수 있습니다.

멤버 변수는 보통 private으로 설정하고

메소드는 public으로 할 수 있습니다.

그래서 오른쪽 코드를 보면 steve라는 객체에 점 연산자를 써도 public인 메소드들은 다 나타나지만

멤버 변수는 볼 수 없는 것을 알 수 있습니다.

 

접근 제어자의 private 멤버 변수의 값을 변경하거나 사용하고 싶을 때는 어떻게 해야 하나요?

  • 생성자로 객체 멤버 변수 값을 초기화합니다.
  • setter 메소드로 객체 멤버 변수의 값을 변경할 수 있습니다.
  • getter 메소드로 객체 멤버 변수의 값을 사용할 수 있습니다.

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

 

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

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

파라미터 문법

User 객체의 private 멤버 변수 email의 값을 저장하는 메소드를 추가해보겠습니다.

String email이 파라미터입니다.

this의 개념과 활용


객체 내부에서의 this는 해당 객체 자신을 의미합니다.
this 예시

파란색이 표시하는 것은 해당 객체 자신의 email을 나타내기 위해서 this를 쓰는 것입니다.
노란색 상자는 파라미터의 email을 나타내는 변수입니다.

만약 this를 쓰지 않고 email만 작성한다면
객체의 email이라고 표현할 수 없고 매개변수 email로 노란색 상자와 똑같은 의미를 갖게 됩니다.

변수의 이름이 중복되지 않는 경우 this로 명시하지 않아도 무방합니다.
파라미터의 이름을 의미 있게 만들면, 멤버 변수의 이름과 보통 중복됩니다.


멤버 변수의 값을 저장(변경)하는 Setter 메소드

  • User 객체의 모든 private 멤버 변수에 값을 저장하는 메소드를 추가하여 멤버 변수를 저장할 수 있도록 합니다.
  • 보통 1개의 멤버 변수의 값을 세팅하는 메소드는 set이라는 동사로 사용합니다.
  • setter라고 지칭합니다.

Setter

 

setter에 추가적인 검증 로직 추가

  • 예를 들어 나이는 음수가 될 수 없고 120이 넘는 경우가 존재하기 힘들기 때문에 적적하지 않은 값이 전달되었을 경우 setter 함수에서 로직을 추가하여 처리가 가능합니다.

 

인자(argument) vs 파라미터

  • 인자는 메소드에 전달하는 데이터(값)입니다.
  • 파라미터는 전달받는 인자 값을 저장하는 변수입니다.

인자와 파라미터 차이


메소드 리턴 값의 활용

  • 메소드의 수행 결과를 값으로 반환합니다.
    • return 키워드를 사용하며 return을 만나면 메소드는 값을 반환하고 종료됩니다.
    • 메소드 내에 1개 이상의 return문을 사용할 수 있습니다.
  • 메소드에 리턴하는 값의 자료형을 명시해야합니다.
  • 리턴 값이 없는 경우도 존재합니다.
    • 이 때는 void를 사용합니다.

 

객체의 private 멤버 변수의 값을 반환하는 메소드 추가

  • User 객체의 모든 private 멤버 변수에 값을 반환하는 메소드 추가
  • return을 사용합니다.
  • 반환 값의 자료형에 대해 명시합니다.
  • 보통 1개의 멤버 변수의 값을 반환하는 메소드는 get이라는 동사로 시작합니다.
  • getter라고 지칭합니다.

 

getter를 호출하여 객체의 멤버 변수 값 사용

private 한 멤버 변수의 저장된 값에 대해서 출력할 때 또는 써야 할 때는

getter 함수를 통해서 멤버 변수의 값을 리턴해서 쓸 수 있습니다.

getter 함수를 쓸 때는

  • 최대한 return문을 적게 쓰는 것이 권장됩니다.(1개 권장)
  • 너무 많은 경우는 메소드의 로직을 파악하기 어렵습니다.

생성자(Constructor)

  • 객체가 생성되는 시점에 호출되는 특별한 형태의 메소드입니다.
  • 객체가 생성되는 시점에 초기화를 하기 위해 사용됩니다.
    • 주로 생성자에서는 객체 멤버 변수의 초기화 작업을 합니다.
  • 멤버 변수를 명시적으로 초기화하지 않은 경우 아래 값이 저장됩니다.
    • 숫자형 변수는 0
    • 불리안 변수는 false
    • 참조 변수는 null

 

문법

  • 생성자의 이름은 클래스의 이름과 동일합니다.
  • 접근 제어자는 보통 public을 사용합니다.
  • 0개 또는 1개 이상의 파라미터 선언이 가능합니다.
  • return 타입은 생략됩니다.

생성자 문법

 

Default 생성자

  • 생성자를 명시적으로 추가하지 않은 경우 Default 생성자를 제공합니다.
    • 1개 이상의 생성자를 명시적으로 구현한 경우는 제공하지 않습니다.
  • Default 생성자 사용의 예
    • 현재까지 사용자 객체에 생성자 존재하지 않았습니다.

 

사용자 객체의 생성자 추가

  • User() 생성자 추가
  • 4개의 멤버 변수를 초기화합니다.

User 생성자 초기화

사용자 객체의 생성자 사용

default 생성자를 사용했을 때와 생성자를 사용했을 때의 차이는 밑의 코드를 통해 알 수 있습니다.

파라미터가 있는 생성자

  • 모든 멤버 변수의 값을 인자로 전달받아 초기화하는 생성자

이렇게 일반적으로 작성합니다.

이러한 방법으로 작성하면 객체 생성과 함께 전달하는 인자 값으로 객체의 멤버 변수를 초기화할 수 있습니다.

추가적으로 모든 멤버 변수에 대해서 초기화할 필요는 없습니다.

멤버 변수의 일부만 초기화하는 생성자도 가능합니다.

email과 password만 초기화하면 나머지 값은 0 또는 null로 나타나게 됩니다.

 

생성자를 구현하는 경우 Default 생성자는 사용이 불가

  • Default 생성자는 명시적으로 구현된 생성자가 없을 경우에만 제공합니다.
  • 생성자를 구현한 경우 Default 생성자를 사용할 수 없습니다.

메소드 오버 로딩

 

같은 작업을 하지만 파라미터만 다른 메소드가 필요한 경우

  • C언어 수학 관련 함수 중 절대 값을 구하는 함수의 종류
    • abs()-> 정수, labs()-> long, fabs() -> float, cabs()->복소수
  • 메소드를 사용할 때 동일 작업을 위한 다양한 이름의 메소드를 기억해야 합니다.
  • 메소드를 개발할 때 파라미터의 조합에 따라 다양한 이름을 생성해야 합니다.
    • 명확한 동작을 의미하는 것이 아닌 조악한 이름이 만들어질 수 있습니다.
    • labs() 같은 경우는 명확한 동작을 나타내는 함수가 아닙니다.

 

메소드 오버 로딩(Method Overloading)

  • 특정 클래스 안에서 파라미터가 다른 동일한 이름의 메소드를 선언합니다.
  • 파라미터의 자료형 또는 개수가 다르면 동일한 이름을 사용 가능합니다.
  • 메소드 호출 시 파라미터 세팅 조건에 따라 호출되는 메소드가 결정됩니다.
  • 리턴 타입은 메소드 오버로딩의 조건에 해당하지 않습니다.

 

메소드 오버로딩 올바른 예시

  • public int add(int a, int b)
  • public int add(int a, int b, int c)
  • public double add(double a, double b)

메소드 오버로딩 부적합한 예시

  • public int add(int a, int b)
  • public int add(int a, int b)
  • public long add(int a, int b)

리턴 타입이 다르다고 메소드 오버 로딩이 되지 않는다는 것을 유의해야 합니다.

 

생성자 오버 로딩

  • 생성자도 특수한 형태의 메소드이기 때문에 오버 로딩이 적용 가능합니다.
  • 초기화 원하는 멤버 변수만 선택해서 초기화가 가능합니다.
  • 생성자 오버 로딩은 빈번하게 사용됩니다.

예시)

객체 생성 시 세팅하는 파라미터의 조합에 따라 서로 다른 생성자가 호출됩니다.

생성자에 따라 각자 다른 데이터를 출력하는 것을 볼 수 있습니다.


다음 게시물에서는 객체지향의 고급적인 내용에 대해 자세히 공부하고 정리해서 다시 찾아뵙겠습니다!

열심히 나아가는 개발자 이었습니다.

go go!

코드프레소 URL: https://www.codepresso.kr/

 

프리미엄 IT 교육 서비스 - 코드프레소

 

www.codepresso.kr

 

728x90
반응형