Project/[코드프레소] JAVA웹개발트랙

[코드프레소] Java 웹개발 트랙 체험단 - Java 프로그래밍 초급

무민_ 2022. 1. 24. 17:08

01강. 객체지향 기초개념

객체지향의 기본개념

SW 개발 방법론

SW는 매우 복잡하고 점점 거대해지고 있다.

요구사항대로 동작하는 SW를 정해진 기간과 예산으로 만드는게 어렵다.

어떻게 해야 큰 규모의 SW를 만들 수 있을까?

→ 소프트웨어 개발 방법론 !

 

객체 지향 프로그래밍 (object oriented programming)

데이터와 데이터에 대한 연산을 수행하는 코드를 그룹화 한 객체를 중심으로 SW를 설계 개발하는 패러다임

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

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

 

설계의 중요성

커피숍을 운영하더라도 어떤 관점에서 업무를 설계하는지에 따라 업무 효율이 다르다.

SW도 마찬가지로 무엇을 중심에 두고 설계하는지가 중요하다.

 

절차지향 vs 객체지향

절차지향 : 시스템의 행위에 집중한다.

객체지향 : 시스템에 참여하는 요소들에 집중한다.

 

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

복잡한 SW 시스템이 역할과 책임에 따라 모듈화 될 수 있다.

SW 구성요소 간의 더 명확한 커뮤니케이션이 가능해진다.

 

 

추상화와 클래스의 개념

클래스

클래스는 Java 프로그램의 기본 단위

바 프로그램은 한개 이상의 클래스로 구성

 

클래스와 객체

자바는 객체지향 언어이다.

클래스로 객체를 생성한다.

객체는 속성과 행동을 갖고있다.

클래스는 객체를 만들기 위한 틀 또는 템플릿이라고 볼 수 있다. (자동차 틀과 실제 만들어진 자동차에 비유 할 수 있다.)

 

구체적 (concrete) vs 추상적 (abstraction)

위에서 아래로 내려오는 과정을 추상화라고 한다.

구체적인 것들은 다양한 정보를 담고 있다.

추상적인 단계에서는 정보가 훨씬 없지만 반드시 필요한 정보는 있다.

구체적 : 눈에 보이고 만질 수 있는 사물 사람, 많은 정보를 포함함

추상적 : 상상 가능하지만 확실한 형상, 개념을 떠올리기 어렵고 꼭 필요한 정보 외의 다른 정보는 누락되어있다.

 

추상화 Abstraction

반드시 필요한 걸 선택하고 불필요한걸 버리는 과정

추상화 과정 자체가 하나의 클래스를 설계하는 과정

특정 객체에 반드시 필요한 속성과 행위를 정의하는 과정

 

좋은 클래스는?

꼭 필요한 최소한의 속성과 행위만 존재한다.

속성과 행위 모두 특정 객체와 높은 관련성이 있어야 한다. (강 사-청소하기 xxx)

너무 큰 규모의 클래스는 분할 될 필요가 있다.

 

 

Java 클래스 구현과 객체 생성

Java 클래스

객체를 생성하기 위한 설계도.

객체를 생성하기 위한 정보들을 포함한다.

(객체가 어떤 종류의 속성들을 가질지, 행위를 가질지)

 

Java 클래스 선언 문법

class 키워드 사용

클래스 이름 선언하고 클래스 내부 구현 코드를 중괄호로 묶음

클래스 내부에는 변수들과 메소드들이 존재, 이를 클래스의 멤버라고 함

변수 : 멤버 변수와 인스턴스 변수가 있다.

메소드 : 메소드와 인스턴스 메소드가 있다.

 

클래스의 이름

주로 명사로 작명한다.

대문자로 시작하며, 단어가 연결될 경우 각 단어의 첫문자 대문자로 표시.

의미있는 이름으로 작명한다

 

객체의 생성

클래스로부터 객체를 생성한다.

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

 

 

객체의 멤버 변수 접근

. 점 연산자로 객체의 멤버에 접근 가능

  • 멤버변수
  • 메소드

 

사용자 객체의 생성

하나의 클래스로 다수의 객체를 생성할 수 있고, 그 객체들은 서로 다른 독립적 객체이다.

 

Point!

클래스는 객체 생성을 위한 설계도, 어떤 속성과 행위를 포함할 것인지 정보 포함

클래스는 class 키워드 사용, 멤버로 변수와 메소드를 포함

클래스의 이름은 대문자로 시작, 명사 형태의 의미있는 이름으로 작명

new 키워드로 객체를 생성해 참조 정보를 변수에 저장

객체 참조 변수의 점 연산자를 사용하여 객체의 멤버에 접근 가능함

 

 

메소드의 개념과 기초 활용

메소드

메소드는 객체의 행위를 정의한다.

메소드는 함수와 거의 유사하다.

  • input과 output이 존재하며, 특정 작업을 수행한다.

메소드는 특정 객체에 포함 되어있다.

  • 독립적으로 존재하지 않는다.

 

함수

특정한 작업을 수행하기 위한 코드들의 집합

특정 작업의 코드들을 모듈화 하여 필요한 경우 호출한다.

코드의 중복을 줄일 수 있다.

 

 

메소드의 문법

메소드를 호출하기 위한 메소드의 이름이 존재함.

특정 작업을 위한 메소드의 구현코드가 중괄호 {} 내부에 구현된다.

 

메소드는 input과 output이 존재한다.

  • Input은 없거나 1개 이상의 파라미터 리스트
  • output은 없거나 리턴 값으로 표시
  • 리턴 타입은 리턴 되는 값의 자료형 (리턴 값이 없을 경우 void)

 

메소드의 이름

메소드의 이름은 행동을 표현하기 위해 보통 동사로 시작

첫 단어는 소문자로 시작, 2개 이상 단어 결합시 연결 단어 처 문자 대문자로

메소드의 이름은 의미있는 이름으로 작성

 

객체의 메소드를 호출

점 연산자로 객체의 멤버(메소드)에 접근 가능

피한 경우 메소드의 인자를 전달

 

Point!

메소드는 함수와 같이 특정 작업을 위한 코드들의 집합이다

메소드는 함수와 다르게 특정 객체에 종속적임

메소드는 input과 output이 존재하고 각각 리턴 값, 파라미터로 표현한다.

메소드의 이름은 동사로 시작하며, 메소드의 행동을 명확히 표현해야 함

객체의 메소드는 점 연산자를 사용하여 호출 가능하다

객체의 메소드는 모든 데이터를 전달하지 않아도 객체의 멤버변수에 대한 연산이 가능하다.

 

 

접근 제어자의 개념 및 적용

캡슐화(Encapsulation)의 2가지 의미

객체의 속성과 행동을 하나의 단위로 그룹화

객체의 속성과 행동을 은닉 (information hiding)

  • 반드시 필요한 속성 및 행동만 외부에 노출한다.
  • 대부분의 속성 및 행동은 외부에서 접근하지 못하도록 막는다.

 

객체의 정보 은닉

객체 내부에는 외부에서 접근해서 변경하면 안되는 속성 존재함. (나이 비밀번호 등)

반드시 필요한 멤버만 외부에 노출해서 결합도를 줄일 수 있다.

결합도 : 객체와 외부의 접근을 아래처럼 표현했을때, 선의 개수

 

객체의 정보 은닉 방법

접근제어자를 활용해서 멤버의 접근 제어

 

접근제어자의 사용

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

클래스는 class 키워드 앞에 명시 ( public class User)

멤버변수는 자료형 앞에 명시 ( private String email;)

메소드는 리턴 타입 앞에 명시 (public boolean isOver20() )

 

외부에서 접근이 불가하고, private 멤버의 객체 내부에서는 접근 가능하다.

보통 모든 멤버 변수는 private로 지정한다.

외부에 반드시 노출이 필요한 메소드만 제외하고, 객체 내부에서만 활용되는 메소드도 private로 지정하자.

 

접근제어자의 활용

프라이빗과 퍼블릭 섞어서 사용하는 경우

 

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

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

point!

캡슐화 중 정보 은닉은 반드시 필요한 멤버만 적절한 단계로 외부에 노출하고 그 외의 정보는 숨기는 것이다.

외부에서 잘못된 형태로 속성을 변경하여 프로그램에 문제가 생기는 것을 막음

객체간의 관계와 양(결합도)를 조정하여 좋은 설계를 만들 수 있음

접근 제어자를 default로 두지 말고 반드시 적절히 명시

public 멤버는 외부 모든 곳에서 접근 가능, private는 외부에서 접근 불가

 

 

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

메소드의 문법

input은 없거나 1개 이상의 파라미터 리스트로 표시함

output은 없거나 리턴 값으로 표시함

리턴 타입은 리턴 되는 값의 자료형(리턴 없으면 void)으로 설정

 

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

파라미터는 메소드의 input 데이터(를 받는 변수)

없거나 1개 이상의 파라미터 존재 가능

메소드 이름 뒤에 위치하며 소괄호 내부에 “자료형 변수명”쌍으로 표현

  • comma로 분리해서 1개 이상의 파라미터 선언 가능

 

this의 개념과 활용

객체 내부에서 this는 해당 객체 자신을 의미한다.

변수의 이름이 중복되지 않는 경우 this로 명시하지 않아도 무방하다.

파라미터의 이름을 의미 있게 만들면, 멤버변수의 이름과 보통 중복됨 그래서 this 씀

 

 

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

User 객체의 모든 private 멤버 변수에 값을 저장하는 메소드 추가

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

이것들을 관례적으로 setter라고 지칭한다.

 

인자(argument) vs 파라미터

인자 : 메소드에 전달하는 데이터(값)

파라미터 : 전달 받는 인자 값을 저장하는 변수

 

메소드 리턴 값의 활용

메소드의 수행 결과를 값으로 반환

  • return 키워드를 사용, return을 만나면 메소드는 값을 반환하고 종료됨
  • 메소드 내에 1개 이상의 retrun문 사용 가능

메소드에 리턴하는 값의 자료형은 명시해줘야함. 리턴값 없으면 void 사용

 

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

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

보통 1개의 멤버 변수의 값을 반환하는 메소드는 get이라는 동사로 시작함.

이를 getter라고 지칭한다.

 

Point

메소드는 input과 output이 있을 수 있고 각각 파라미터와 리턴 값을 사용

메소드는 0개이거나 1개 이상의 파라미터 가능

this 키워드는 생성된 객체 자기 자신을 가리킴

메소드 내부의 변수 명과 객체의 멤버변수 명이 중복될 경우 this를 사용

private 멤버 변수의 값을 변경하거나 반환하는 메소드를 각각 setter, getter라고 함

메소드의 리턴 값이 있을 경우, 리턴 값의 자료형과 return문을 명시한다.

return문은 메소드 내에서 여러번 사용 가능하지만, 권장되지는 않는다.

 

 

생성자의 활용

생성자 (constructor)

객체가 생성되는 시점에 호출 되는 특별한 형태의 메소드

객체가 생성되는 시점에 초기화를 하기 위해 사용됨

  • 주로 생성자에서는 객체 멤버 변수의 초기화 작업을 함

멤버 변수를 명시적으로 초기화 하지 않은 경우 아래 값이 저장 된다.

숫자형 변수 : 0

불리안 변수 : false

참조 변수 : null

 

생성자의 문법

생성자의 이름은 클래스의 이름과 동일

접근제어자는 보통 public을 사용

0개 또는 1개 이상의 파라미터 선언 가능

리턴 타입 생략됨

 

Default 생성자

생성자를 명시적으로 추가하지 않은 경우 디폴트 생성자를 제공함

  • 1개 이상의 생성자를 명시적으로 구현한 경우는 제공하지 않음

디폴트 생성자 사용 예 : 현재까지 사용자 객체에 생성자 존재하지 않음

 

 

파라미터가 있는 생성자

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

 

파라미터가 있는 생성자의 호출

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

 

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

디폴트 생성자는 명시적으로 구현 된 생성자가 없을 경우에만 제공

생성자를 구현한 경우 디폴트 생성자를 사용할 수 없다.

 

point!

생성자는 객체가 생성시 호출되는 특별한 형태의 메소드

생성자의 이름은 클래스명과 동일, 리턴타입 사용하지 않음

생성자는 주로 객체의 멤버 변수를 초기화 하는 목적으로 사용

생성자를 명시적으로 구현하지 않은 경우 디폴트 생성자를 제공한다.

파라미터가 있는 생성자를 호출하기 위해서는 new 키워드로 객체 생성시 인자를 전달해야 한다.

 

 

 

메소드 오버로딩

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

C언어 수학 관련 함수 중 절대값을 구하는 함수 종류 : abs(), labs(), fabs(), cabs()

메소드를 사용시 동일 작업을 위한 다양한 이름의 메소드를 기억해야 함

메소드 개발시 파라미터의 조합에 따라 다양한 이름을 생성해야 함

: 명확한 동작을 의미하는게 아닌 조악한 이름 만들어질지도 ..

 

메소드 오버로딩

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

파라미터의 자료형 또는 입력하는 개수가 다르면 동일 이름 사용 가능

메소드 호출시 파라미터 세팅 조건에 따라 호출되는 메소드가 결정됨

리턴 타입은 메소드 오버로딩의 조건에 해당하지 않음

리턴 타입은 달라도 됨! 파라미터가 다르거나 파라미터의 자료형이 달라야함.

리턴타입만 다른건 또 안됨.

 

 

생성자 오버로딩

생성자도 특수한 형태의 메소드이기 때문에 오버로딩 사용 가능

초기화를 원하는 멤버변수만 선택해서 초기화가 가능하다.

생성자 오버로딩은 빈번히 사용된다.

 

Point!

메소드 오버로딩은 서로 다른 조합의 파라미터를 사용하는 동일한 이름의 메소드를 한 클래스 내부에서 사용하는 것임

의미있는 메소드의 이름을 여러 메소드에 사용 가능

메소드 호출시 세팅하는 파라미터에 따라 어떤 메소드가 호출될지 결정한다

리턴 타입은 메소드 오버로딩의 조건이 되지 않는다

생성자도 오버로딩 가능함

 

 


02강. 객체지향 고급

상속의 기본 개념

일반화된 클래스의 내용을 가지면서도 자신의 특별한 특성까지 정의된 클래스를 상속받았다고 말한다.

상속을 하는 클래스 : 부모, 상위, 기반클래스

상속 받는 클래스 : 자식, 하위, 파생클래스

즉, 일반화된 클래스를 재사용하여 specific한 구체적인 클래스를 생성하는 것이다.

자식 클래스는 부모클래스의 모든 멤버변수와 메소드를 상속받음

상속을 거듭할수록 자식 클래스의 멤버변수와 메소드 개수는 같거나 늘어난다.

상속의 횟수는 제한이 없다.

 

상속의 개념

상속은 객체지향 프로그래밍을 구성하는 주요 특징 중 하나이다.

클래스 간의 계층적 분류가 가능해진다.

 

Java로 상속 구현하기

extends를 사용하여 부모 클래스의 멤버를 상속받기 가능

  • class 자식 클래스명 extends 부모 클래스명 {...}

 

상속의 특징

클래스간 계층적 분류 가능

상속받은 멤버는 자식에서 별도 선언 안함

상속받은 멤버에 대한 코드는 부모 클래스에서 공통적으로 관리 가능

 

상속의 장점

코드의 재사용성 증가

클래스 간 계층구조에 따른 다형성 적용 가능

 

단일 상속

자바는 다중 상속을 허용하지 않는다.

즉, 하나의 클래스로 부터만 상속 가능 (부모는 하나여야 한다)

 

상속 관계와 접근 제어(private과 protected)

접근제어자

외부로부터 접근을 제한하기 위한 목적의 키워드

상속관계에서의 접근을 제한하기 위해서도 사용된다.

  • public, protected, default, private ... → private 멤버변수가 있는 경우 어떻게 될까?

 

private 접근 제어자

외부로부터의 접근을 제한하기 위한 키워드

오직 같은 클래스 내에서만 접근 가능하다.

그래서 상속받은 자식 클래스에서도 해당 멤버변수에는 접근이 제한된다.

프라이빗 멤버변수에 접근하려고 하면 권한 에러가 뜬다.

부모클래스의 private 멤버 변수는 상속받은 자식 클래스에서 접근이 제한됨

private 멤버변수에 대해 외부 접근이 필요한 경우, 부모 클래스에 public getter, setter 메소드를 제공한다.

 

protected 접근제어자

외부로부터의 접근을 제한하기 위한 키워드

상속받은 자식 클래스에서의 접근을 가능하게 함

 

상속받은 클래스에서는 접근 가능하다.

즉, 외부까지는 아니고 자식클래스 까지에서만 접근이 가능해짐.

이는 외부 모든 곳에서 접근 가능한 public과의 차이점이다.

 

상속 관계의 접근 제어

자식 클래스에서의 접근을 제한 : private

자식 클래스에서의 접근을 허용 : protected

멤버 변수의 특성에 맞는 접근 제어자를 선택하는 것이 중요함

 

 

상속 관계의 생성자와 super 키워드

주의사항

실습 코드가 길어짐에 따라 접근 제어자 생략할거임

 

상속 관계에서 생성자는 어떻게 동작하는가?

실행시에는 최상위 부모 클래스의 생성자부터 실행됨을 알 수 있다.

→ 부모클래스의 생성자는 상속되지 않는다.

자식 클래스의 객체를 생성 시, 부모 클래스의 기본 생성자를 자동으로 호출한다.

최상위 부모 클래스의 생성자부터 한 단계 아래 자식으로 차례대로 호출된다.

 

명시적으로 부모 생성자의 호출이 없는데 어떻게 가능한 것인가?

super 키워드

java에서 super는 부모 클래스를 의미하는 키워드이다.

spuer(); 코드는 부모 클래스의 파라미터 없는 생성자를 호출한다.

→ 메소드를 호출하듯이 부르면 생성자를 호출하는 것이고, 인자가 없는 super(); 키워드는 인자 없는 부모 클래스의 생성자를 호출하는 것이다.

자식 클래스에서 부모 클래스 생성자를 명시적으로 호출하지 않으면, java 컴파일러는 자식 클래스 생성자의 첫 번째 라인에 super();를 자동으로 삽입한다.

 

파라미터가 있는 부모 생성자는 자바 컴파일러가 자동으로 호출하지 않는다.

파라미터가 있는 생성자를 호출할 때는 반드시 명시적인 선언이 필요하다.

 

자바에서 super는 부모 클래스를 지칭하는 키워드이다.

부모 클래스의 멤버변수 또는 메소드 접근 시 super를 사용한다.

 

메소드 호출 형태가 아닌 . 닷을 사용하여 접근하는 형태는 부모의 멤버변수 또는 메소드에 접근하는 방식이다.

 

point

상속 시 생성자는 상속되지 않는다

super()는 파라미터가 없는 부모 클래스 생성자를 호출

자식 객체 생성자에서 명시적으로 부모 클래스 생성자를 호출하지 않는 경우 ㄴuper()를 자동으로 호출한다

파라미터가 있는 부모 객체 생성자는 명시적으로 호출해야 함

super는 부모 클래스를 지칭함

super. 으로 부모 클래스의 멤버에 접근 가능.

 

 

메소드 오버라이딩

부모 클래스로부터 상속받은 메소드를 자식 클래스가 자신만의 특성에 맞게 새롭게 구현하는 것

(자식이 라이딩해서 새로 구현한다)

 

메소드 오버라이딩의 조건

오버라이딩 하는 부모 클래스의 메소드와 이름, 파라미터, 리턴타입이 같아야 함

 


https://www.codepresso.kr/

 

Notion 정리본 : https://rapid-run-744.notion.site/Java-6dca205b818c4dc5ae28160dbd7b6d65