[Java] Java 프로그래밍 초급

이 글은 "코드 프레소 Java 웹 개발 체험단 활동"을 통해 배운 것을 정리하는 글입니다.

🔗 코드프레소 URL

네 번째 강의는 바로 "Java 프로그래밍 초급"이다.


[ 객체지향 기본 개념 ]

1. 객체 지향 프로그래밍 ( OOP, Object Oriendted Programming )

  • 데이터와 데이터에 대한 연산을 수행하는 코드를 그룹화한 객체를 중심으로 SW를 설계 개발하는 패러다임이다.
  • 시스템의 행위보다 시스템에 참여하고 책임을 갖는 객체가 무엇인지에 주목한다.
  • 다수의 객체가 각자의 역할을 하고, 객체 간에는 메시지를 주고 받으며 전체 시스템을 구성한다.

2. 절차 지향 vs 객체 지향

  • 절차 지향: 시스템의 행위에 집중
  • 객체 지향: 시스템에 참여하는 요소들에 집중

이러닝 시스템을 설계한다고 가정한다면,

  • 절차 지향은 강의 수강 기능, 강의 구매 기능 함수를 설계, 구현할 것이다.
  • 객체 지향은 강사 객체의 책임/속성/기능, 수강생 객체의 책임/속성/기능, 강사 객체와 수강생 객체의 관계에 대해 집중할 것이다.

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

  • 복잡한 SW 시스템이 역할/책임에 따라 모듈화될 수 있다.
  • SW 구성 요소 간의 더 명확한 커뮤니케이션이 가능하다.
  • 결과적으로 SW를 좀더 쉽게 유지보수할 수 있다.

[ 추상화와 클래스의 개념 ]

1. 추상화

  • 반드시 필요한 것들을 선택하고 불필요한 것들을 버리는 과정을 말한다.
  • 추상화의 과정 자체가 하나의 클래스를 설계하는 과정이다.
  • 즉, 특정 객체에 반드시 필요한 속성과 행위를 정의하는 과정이다.

2. 추상화 예시 - 이러닝 시스템 개발

✅ 강사 클래스

  • 가질 수 있는 속성: 나이, 키, 몸무게, 이름, 성별, 주소, 학위, 전공, 경력, 국적, 전문분야, 강의가능 과목, ...
  • 수행 가능한 행위: 강의하기, 밥먹기, 잠자기, 채점하기, 운동하기, ...

→ 위의 속성과 행위는 너무 구체적으로 표현되어 있다.

이러닝 시스템의 관점에서 꼭 필요한 속성과 행위만 추려낸다면 다음과 같을 것이다.

  • 속성: 이름, 학위, 전공, 경력, 전문분야, 강의과목
  • 행위: 강의하기, 숙제내기, 채점하기, 멘토링하기

위의 내용을 가지고 강사 클래스를 나타낸다면 다음과 같다.

✅ 사용자 클래스

  • 가질 수 있는 속성: 나이, 키, 몸무게, 이름, 성별, 주소, 아이디, 전공, 비밀번호, 국적, 닉네임, 이메일, ...
  • 수행 가능한 행위: 밥먹기, 잠자기, 회원가입하기, 로그인하기, 유튜브 보기, 강의 구매하기, 운동하기, ...

→ 위의 속성과 행위는 너무 구체적으로 표현되어 있다.

이러닝 시스템의 관점에서 꼭 필요한 속성과 행위만 추려낸다면 다음과 같을 것이다.

  • 속성: 이름, 아이디, 비밀번호, 닉네임, 이메일
  • 행위: 회원가입하기, 로그인하기, 강의 구매하기, 강의 시청하기, 회원정보 조회하기

위의 내용을 가지고 사용자 클래스를 나타낸다면 다음과 같다.


3. 좋은 클래스는

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

[ Java 클래스 선언과 객체 생성 ]

1. Java 클래스 선언 문법

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

2. 클래스 이름

  • 클래스의 이름은 주로 명사로 작명한다.
  • 대문자로 시작하며, 단어가 연결될 경우 각 단어의 첫 문자를 대문자로 표시한다.
  • 이름은 생성되는 객체를 가장 잘 표현하는 의미 있는 이름으로 작명한다.

3. 객체 생성

  • 클래스로부터 객체를 생성한다.
클래스명 변수명 = new 클래스명();
  • 객체를 생성하고 그 객체에 대한 참조 정보를 변수에 저장한다.

4. 객체의 멤버 변수 접근

  • 점 연산자(dop operator) .로 객체 멤버에 접근이 가능하다.
    • 멤버 변수
    • 메소드
객체참조변수명.멤버변수명
  • 다음의 상황에서 멤버 변수에 접근한다.
    • 객체의 멤버 변수에 새로운 값을 저장하거나,
    • 객체의 멤버 변수에 저장되어 있는 값을 사용할 때

Point

  • 클래스는 객체 생성을 위한 설계도로, 어떤 속성과 행위를 포함할 것인지의 정보를 포함
  • 클래스는 class 키워드를 사용하고 멤버로 변수와 메소드를 포함
  • 클래스의 이름은 대문자로 시작하며 명사 형태의 의미 있는 이름으로 작명
  • new 키워드로 객체를 생성하여 참조 정보를 변수에 저장
  • 객체 참조 변수의 점 연산자를 사용하여 객체의 멤버에 접근 가능

[ 메소드의 개념과 기초 활용 ]

1. 메소드 vs 함수

📌 메소드 ( method )

  • 객체는 속성과 행위를 갖고 있고, 메소드는 객체의 행위를 정의한다.
  • 메소드는 함수와 거의 유사하다.
    • inputoutput이 존재하며 특정 작업을 수행한다.
  • 메소드는 특정 객체에 포함되어 있다. 즉, 독립적으로 존재하지 않는다.

📌 함수 ( function )

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

📌 메소드 vs 함수

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

2. 메소드의 문법

  • 메소드를 호출하기 위한 메소드의 이름이 존재한다.
  • 특정 작업을 위한 메소드의 구현 코드가 중괄호 내부에 구현된다.
[접근제어자] 리턴타입 메소드이름(파라미터1, 파라미터2, ...) {
    메소드의 구현코드;
    [return 리턴값;]
}
  • 메소드는 inputoutput이 존재한다.
    - input은 없거나 1개 이상의 파라미터 리스트
    - output은 없거나 리턴 값으로 표시
    - 리턴 타입은 리턴되는 값의 자료형(리턴 값이 없을 경우 void)


3. 메소드의 이름

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

Point

  • 메소드는 함수와 같이 특정 작업을 위한 코드들의 집합이다.
  • 메소드는 함수와 다르게 특정 객체에 종속적이다.
  • 메소드는 Inputoutput이 존재하고 각각 리턴값, 파라미터로 표현한다.
  • 메소드의 이름은 동사로 시작하며, 메소드의 행동을 명확하게 표현해야 한다.
  • 객체의 메소드는 점 연산자를 사용하여 호출 가능하다.
  • 객체의 메소드는 모든 데이터를 전달하지 않아도 객체의 멤버 변수에 대한 연산이 가능하다.

[ 접근 제어자의 개념 및 적용 ]

1. 캡슐화의 2가지 의미

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

2. 객체의 정보 은닉

📌 필요성

  • 객체 내부에는 외부에서 접근해서 변경하면 안되는 속성이 존재한다.
    • 사용자 객체의 나이를 -10이나 100으로 변경한다면?
    • 사용자 객체의 비밀번호를 변경한다면?
  • 반드시 필요한 멤버만 외부에 노출하여 결합도를 줄일 수 있다.

📌 은닉 방법

접근 제어자를 활용하여 멤버의 접근을 제어한다.

Java 접근 제어자의 종류는 다음과 같다.

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

3. 접근 제어자

📌 사용

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

  • 클래스는 class 키워드 앞에 명시 - public class User
  • 멤버 변수는 자료형 앞에 명시 - private String email;
  • 메소드는 리턴 타입 앞에 명시 - public boolean isOver20()

📌 private 접근 제어자

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

📌 활용

private 멤버 변수의 값을 변경하거나 사용하고 싶을 때

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

Point

  • 캡슐화 중 정보 은닉반드시 필요한 멤버만 적절한 단계로 외부에 노출하고 그 외의 정보는 숨기는 것을 말한다.
  • 캡술화는 외부에서 잘못된 형태로 속성을 변경하여 프로그램에 문제가 생기는 것을 막는다.
  • 객체 간의 관계의 양(결합도)를 조정하여 좋은 설계를 만들 수 있다.
  • 접근 제어자를 default로 두지 말고 반드시 적절하게 명시해야 한다.
  • public 멤버는 외부의 모든 곳에서 접근 가능하지만, private 멤버는 외부에서 접근 불가!

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

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

  • 파라미터는 메소드의 input 데이터이다.
  • 파라미터는 없거나 1개 이상의 올 수 있다.
  • 메소드 이름 뒤에 위치하며 소괄호 내부에 자료형 변수명 쌍으로 표현한다.
    • ,로 분리하여 1개 이상의 파라미터 선언할 수 있다.
[접근제어자] 리턴타입 메소드이름(자료형 변수명, 자료형 변수명, ...) {
    메소드의 구현코드;
    [return 리턴값;]
}

2. this

  • 객체 내부에서의 this는 해당 객체 자신을 의미한다.
  • 변수의 이름이 중복되지 않는 경우 this로 명시하지 않아도 무방하다. 하지만 파라미터의 이름을 의미있게 만들면, 멤버 변수의 이름과 보통 중복된다.

3. Setter 메소드

📌 멤버 변수의 값을 저장(변경)

  • 보통 1개의 멤버 변수의 값을 세팅하는 메소드는 set이라는 동사로 시작한다.
  • setter라고 지칭한다.

📌 추가적인 검증 로직 추가

  • 나이는 음수가 될 수 없고 120이 넘는 경우가 존재하기 힘들다.
  • 아래와 같이 추가적인 검증 로직을 추가하여 적절한 값으로 처리해준다.
public void setAge(int age) {
   if (age < 0) {
       age = 0;
   } else if (age > 120) {
       age = 120;
   }
   this.age = age;
}

4. 인자 ( argument ) vs 파라미터

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


5. 메소드의 리턴 값의 활용

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

6. Getter 메소드

  • 보통 1개의 멤버 변수의 값을 반환하는 메소드는 get이라는 동사로 시작한다.
  • getter라고 지칭한다.

Point

  • 메소드는 inputoutput이 있을 수 있고 각각 파라미터와 리턴값을 의미한다.
  • 메소드는 0개 이거나 1개 이상의 파라미터를 가질 수 있다.
  • this 키워드는 생성된 객체 자기 자신을 가리킨다.
  • 메소드 내부의 변수명과 객체의 멤버 변수명이 중복될 경우 this를 사용한다.
  • private 멤버 변수의 값을 변경하거나 반환하는 메소드를 각각 setter, getter라고 한다.
  • 메소드의 리턴값이 있을 경우, 리턴 값의 자료형과 return문을 명시한다.
  • return문은 메소드 내에서 여러 번 사용 가능하다. (권장하지는 않는다.)

[ 생성자의 활용 ]

1. 생성자 ( Constructor )

생성자란 객체가 생성되는 시점에 호출되는 특별한 형태의 메소드를 말한다.

  • 객체가 생성되는 시점에 초기화를 하기 위해 사용된다.
    • 주로 생성자에서는 객체 멤버 변수의 초기화 작업을 한다.
  • 멤버 변수를 명시적으로 초기화하지 않은 경우 아래 값이 저장된다.
    • 숫자형 변수는 0
    • 불리안 변수는 fasle
    • 참조 변수는 null

2. 문법

  • 생성자의 이름은 클래스의 이름과 동일하다.
  • 접근 제어자는 보통 public을 사용한다.
  • 0개 또는 1개 이상의 파라미터 선언 가능하다.
  • 리턴 타입은 생략된다.
public 클래스이름(파라미터1, 파라미터2, ...) {
    생성자 내부 코드;
}

3. Default 생성자

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

      User Steve = new User();

4. 파라미터가 있는 생성자

  • 모든 멤버 변수의 값을 인자로 전달 받아 초기화하는 생성자
  • 객체 생성과 함께 전달하는 인자값으로 객체의 멤버 변수를 초기화한다.

Point

  • 생성자는 객체가 생성될 때 호출되는 특별한 형태의 메소드이다.
  • 생성자의 이름은 클래스명과 동일하며 리턴 타입은 사용하지 않는다.
  • 생성자는 주로 객체의 멤버 변수를 초기화하는 목적으로 사용한다.
  • 생성자를 명시적으로 구현하지 않은 경우 Default 생성자를 제공한다.
  • 파라미터가 있는 생성자를 호출하기 위해서는 new 키워드로 생성 시 인자를 전달해야 한다.

[ 메소드의 오버로딩 ]

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

  • C 언어 수학 관련 함수 중 절댓값을 구하는 함수의 종류
    • abs(), labs(), fabs(), cabs() → 자료형에 따라 달라진다.
  • 메소드를 사용할 때 동일 작업을 위한 다양한 이름의 메소드를 기억해야 한다.
  • 메소드를 개발할 때 파라미터의 조합에 따라 다양한 이름을 생성해야 한다.
    • 명확한 동작을 의미하는 것이 아닌 조악한 이름이 만들어질 수 있다.

2. 메소드 오버로딩

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

  • 파라미터의 자료형 또는 개수가 다르면 동일한 이름 사용 가능하다.
  • 메소드 호출 시 파라미터 세팅 조건에 따라 호출되는 메소드가 결정된다.
  • 리턴 타입은 메소드 오버로딩의 조건에 해당하지 않는다.
  • 메소드 오버로딩의 적합한 예시
    • 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) → 리턴타입이 다른 것으로는 의미가 없다.

3. 생성자 오버로딩

  • 생성자도 특수한 형태의 메소드이기 때문에 오버로딩 적용 가능하다.
  • 초기화 원하는 멤버 변수만 선택해서 초기화 가능하다.
  • 생성자 오버로딩은 빈번하게 사용된다.
  • 객체 생성 시 세팅하는 파라미터의 조합에 따라 서로 다른 생성자가 호출된다.

Point

  • 메소드 오버로딩은 서로 다른 조합의 파라미터를 사용하는 동일한 이름의 메소드를 한 클래스 내부에서 사용하는 것이다.
  • 의미있는 메소드의 이름을 여러 메소드에 사용할 수 있다.
  • 메소드 호출 시 세팅하는 파라미터에 따라 어떤 메소드가 호출될지를 결정된다.
  • 리턴 타입은 메소드 오버로딩의 조건이 되지 않는다.
  • 생성자도 오버로딩 가능하다.

좋은 웹페이지 즐겨찾기