이 글은 코드프레소 Java 웹 개발 체험단 활동 중 Java 프로그래밍 초급 강좌를 기반으로 작성하였습니다.
코드프레소 URL: https://www.codepresso.kr/
강의 목차
먼저 강의 목차는 아래 그림과 같이 구성되어 있습니다.
객체지향 기초개념
객체 지향 프로그래밍(Object Oriented Programming)?
객체 지향 프로그래밍이란 데이터와 데이터에 대한 연산을 수행하는 코드를 그룹화 한 객체를 중심으로 SW를 설계 개발하는 패러다임이다. 시스템의 행위봐, 시스템에 참여하고 책임을 갖는 객체가 무엇인지에 주목해야하며 다수의 객체가 각자의 역할을 하고, 객체 간에는 메시지를 주고 받으며 전체 시스템을 구성해야 한다.
객체 지향 프로그래밍의 장점?
- 복잡한 SW 시스템이 역할/책임에 따라 모듈화 될 수 있다.
- SW 구성 요소 간의 더 명확한 커뮤니케이션이 가능함
- 결과적으로 SW를 좀 더 쉽게 유지보수 할 수 있음
추상화와 클래스 설계
클래스?
클래스는 Java 프로그램의 기본단위이다. Java 프로그램은 한 개 이상의 클래스로 구성이 되며 일반적으로 1개의 클래스는 1개의 Java 파일이다.
클래스는 특정 객체를 어떻게 생성할 지에 대한 정보를 갖고 있는 설계도
객체
객체는 속성과 행동을 갖고 있다.
구체적(Concrete) vs 추상적(Abstraction)
- 구체적
- 눈에 보이고 만질 수 있는 사물, 사람
- 추상적
- 상상을 가능하지만 확실한 형상이나 개념을 떠올리기 어려움
- 꼭 필요한 정보 외에는 다른 정보가 누락 되어 있음
추상화란 반드시 필요한 것들을 선택하고 불필요한 것들을 버리는 과정이다. 추상화의 과정 자체가 하나의 클래스를 설계하는 과정이다. 즉, 특정 객체에 반드시 필요한 속성과 행위를 정의하는 과정이라고 볼 수 있다.
좋은 클래스란?
- 꼭 필요한 최소한의 속성과 행위만 존재한다
- 속성과 행위 모두 특정 객체와 높은 관련성이 있어야 한다
- 너무 큰 규모의 클래스는 분할 될 필요가 있다
Java 클래스 선언과 객체 생성
Java 클래스
Java에서 클래스란 객체(Object)를 생성하기 위한 설계도(blueprint)이다.
클래스의 이름은 주로 명사로 작명한다. 대문자로 시작하며, 단어가 연결될 경우 각 단어의 첫 문자를 대문자로 표시한다. 이름은 생성 되는 객체를 가장 잘 표현하는 의미 있는 이름으로 작명한다.
ex) CoffeeMaker, DatabaseConnection Manager
객체의 생성
- 클래스로부터 객체를 생성
클래스명 변수명 = new 클래스명();
객체를 생성하고 그 객체에 대한 참조 정보를 변수에 저장한다.
객체의 멤버 변수 접근
- 점 연산자(dot operator)로 객체의 멤버에 접근 가능하다
- 멤버 변수
- 메소드
객체참조변수명.멤버변수명
메소드의 개념과 기초 활용
메소드(Method)
객체는 속성과 행위를 갖고 있고, 메소드는 객체의 행위를 정의한다. 메소드는 함수(function)과 거의 유사하다. 메소드는 특정 객체에 포함되어 있다.
메소드의 이름은 행동을 표현하기 위해 보통 동사로 시작한다. 첫 단어는 소문자로 시작하며, 2개 이상의 단어가 결합 될 경우 연결 되는 단어의 첫 문자를 대문자로 표시한다.
ex) getUserInfo(), setPassword(), signUp()
메소드 vs 함수
접근 제어자의 개념 및 적용
캡슐화(Encapsulation)의 2가지 의미
- 객체의 속성과 행동을 하나의 단위로 그룹화
- 객체의 속성과 행동을 은닉(Information Hiding)
- 반드시 필요한 속성 및 행동만 외부에 노출
- 대부분의 속성 및 행동은 외부에서 접근하지 못하도록 막음
(객체 내부에는 외부에서 접근해서 변경하면 안되는 속성이 존재한다.)
객체의 정보 은닉 방법?
- 접근 제어자(Access Modifier)를 활용하여 멤버의 접근을 제어
private 접근 제어자
private으로 지정 된 멤버는 외부에서 접근이 불가능하다.(객체 내부에서는 접근 가능) 보통 모든 멤버 변수는 private로 지정하는데 외부에 반드시 노출이 필요한 메소드만 제외 하고, 객체 내부에서만 활용되는 메소드도 private으로 지정한다.
생성자의 활용
생성자란 객체가 생성되는 시점에 호출 되는 특별한 형태의 메소드이다. 객체가 생성되는 시점에 초기화를 하기 위해 사용된다.(객체 멤버 변수의 초기화 작업) 멤버 변수를 명시적으로 초기화 하지 않은 경우 숫자형 변수는 0, 불리안 변수는 false, 참조 변수는 null로 저장이 된다.
생성자(Constructor)의 문법
메소드 오버로딩
메소드 오버로딩은 같은 작업을 하지만 파라미터만 다른 메소드가 필요한 경우 사용이 된다.
- 특정 클래스 안에서 파라미터가 다른 동일한 이름의 메소드를 선언
- 파라미터의 자료형 또는 개수가 다르면 동일한 이름 사용 가능
- 메소드 호출 시 파라미터 세팅 조건에 따라 호출 되는 메소드가 결정 됨
- 리턴 타입은 메소드 오버로딩의 조건에 해당 하지 않음
생성자 오버로딩
생성자도 특수한 형태의 메소드이기 때문에 오버로딩이 적용 가능하다. 초기화 원하는 멤버 변수만 선택해서 초기화 가능하며 생성자 오버로딩은 빈번하게 사용이 된다.
객체지향 고급
상속의 기본 개념
상속이란 일반화된 클래스(부모 클래스)를 재사용하여 새로운 specific한 클래스(자식 클래스)를 생성하는 것으로 자식 클래스는 부모 클래스의 모든 멤버변수와 메소드를 상속받는다. 상속은 거듭할수록 자식 클래스의 멤버변수와 메소드 개수는 같거나 늘어나며 상속의 횟수는 제한이 없다.
자바는 다중상속을 허용하지 않는다.
상속의 특징
- 클래스 간의 계층적 분류(hierarchical classifications)가 가능해짐
- 상속받은 멤버는 자식 클래스에서 별도로 선언하지 않음
- 상속받은 멤버에 대한 코드는 부모 클래스에서 공통적으로 관리할 수 있음
상속의 장점
- 코드의 재사용성 증가
- 클래스 간의 계층 구조에 따른 다형성(polymorphism) 적용 가능
상속 관계의 생성자
super 키워드
Java에서 super는 부모 클래스를 의미하는 키워드이다. super();는 부모 클래스의 파라미터 없는 생성자를 호출한다. 자식 클래스에서 부모 클래스 생성자를 명시적으로 호출하지 않으면, Java 컴파일러는 자식 클래스 생성자의 첫 번째 라인에 super();를 자동으로 삽입한다.
파라미터가 있는 부모 생성자는 Java 컴파일러가 자동으로 호출하지 않기 때문에 반드시 명시적인 선언이 필요하다.
부모 클래스의 멤버 변수 또는 메소드 접근 시 super 사용한다.
오버라이딩
오버라이딩이란 부모 클래스로부터 상속받은 메소드를 자식 클래스가 자신만의 특성에 맞게 새롭게 구현하는 것이다. 오버라이딩을 통해 코드의 간결성을 유지하면서 내용을 확장시킬 수 있다.
메소드 오버라이딩 조건
- 오버라이딩하는 부모 클래스의 메소드와 이름이 같아야 한다.
- 오버라이딩하는 부모 클래스의 메소드와 파라미터가 같아야 한다.
- 오버라이딩하는 부모 클래스의 메소드와 리턴타입이 같아야 한다.
다형성의 이해
- 하나의 타입이 때에 따라 여러 종류의 객체의 특성을 가질 수 있는 것
- 같은 형태의 메소드가 때에 따라 다양한 동작을 수행
- Java에서는 다음 특성을 이용하여 다형성을 구현할 수 있다.
- 부모클래스의 참조 변수가 자식클래스의 객체를 참조할 수 있음
패키지의 이해
패키지는 관련 있는 클래스를 한 데 묶어 놓은 그룹이다.
클래스를 구분하는 일종의 디렉토리로 하위 계층 구조를 가질 수 있다.
패키지명 작성
- 패키지명은 소문자로만 작성하며, 클래스들의 묶음을 표현하는 의미 있는 이름으로 작성한다.
- 패키지는 계층 구조를 가지며 일반적으로 '1차도메인.회사명.'으로 시작된다.
- com.회사명.프로젝트명.모듈명.서브모듈명.
- org.회사명(-조직명).프로젝트명.모듈명.서브모듈명.
- (예) com.codepresso.newtube.user
- 패키지의 이름과 구조는 실제 OS의 디렉토리 구조와 매핑된다.
- 패키지를 생성하면 실제 디렉토리도 새로 생성 됨
패키지와 클래스
모든 클래스는 반드시 하나 이상의 패키지에 속한다. 클래스 생성시 패키지를 선언하지 않으면, 이름 없는 패키지(unnamed package)에 포함하는데 패키지를 선언하지 않은 모든 클래스는 모두 동일한 패키지에 속한다.
컬렉션 프레임워크: List
컬렉션 프레임워크의 개념
컬렉션 프레임워크(collection framework)란 여러 건의 데이터를 다루기 위해서는 Array와 같은 데이터를 다루기 위한 자료구조의 구현체가 필요하다. 컬렉션 프레임워크는 다양한 자료구조의 구현을 위한 클래스와 인터페이스의 집합이다.
- 컬렉션 프레임워크에는 아래의 주요 인터페이스가 정의 되있다.
- List와 Set 인터페이스는 모두 Collection 인터페이스를 상속받아 정의한다.
- Map 인터페이스는 구조상 차이로 Collection 인터페이스를 상속 받지 않는다.
주요 인터페이스들의 특징
- 순서가 있는 데이터의 집합
- 데이터들의 중복을 허용
- 순서가 없는 데이터의 집합
- 데이터들의 중복을 허용하지 않음
- Key와 Value로 이루어진 pair를 갖는 데이터의 집합
- 데이터들 간의 순서가 없음
- Key는 중복을 허용하지 않음, Value는 중복을 허용
제네릭과 컬렉션 프레임워크
제네릭(generic)이란?
제네릭이란 데이터의 타입을 일반화한다는 것을 의미한다. 클래스나 메소드에서 사용할 데이터의 타입을 컴파일 시 type check하여 런타임 시의 안정성이 보장 된다.
< T >:
- 클래스 내부에서 사용될 임의의 데이터 타입을 'T'라는 type variable로 지정
- 'T'는 Type의 약어로 관행적으로 사용되는 이름이다.
- type variable 'T'를 이용해 클래스 내부 변수 생성 및 메서드의 인자, 반환 값의 타입지정 가능
- 'T'라는 type variable은 임의 값으로 지정 가능
제네릭의 장점
- 매개 변수의 범용성(generality) 확보
- 클래스 내 임의의 변수를 매번 다른 데이터 타입으로 지정하여 객체 생성 가능
- 컴파일 시 type check로 인한 런타임 안정성 확보
- 타입 변환 및 타입 검사에 들어가는 노력을 줄일 수 있음
List 자료구조 컬렉션 클래스에 대한 이해
- Collection< E > 인터페이스에서 정의된 메서드에 List 자료구조에 필요한 메서드가 추가로 정의 됨
- 대표적인 List 자료구조의 컬렉션 클래스
- ArrayList< E >가 가장 많이 사용되는 클래스
ArrayList< E > 클래스에 대한 이해
- Array와 가장 유사한 컬렉션 클래스
- Array처럼 객체 내부 데이터 접근하기 위한 인덱스 존재
- Array와 다르게 생성된 객체에서 데이터의 추가와 삭제가 자유롭게 가능
- Java.util 패키지에 존재
Map 자료구조 컬렉션 클래스에 대한 이해
Map 자료 구조 데이터
- 한 사람의 정보를 저장
- 하나의 데이터를 설명하기 위한 여러 속성 정보가 필요
- 속성 간에는 순서가 필요 없음
- 동일한 속성으로 여러 개 값이 존재하지 않음
Map 자료 구조를 위해 정의된 인터페이스
- Pair(Key-Value) 데이터 여러 건을 하나의 객체로 관리
- 입력된 데이터에 순서가 존재하지 않음
- Key는 Value를 찾기 위한 고유한 주소의 역할을 수행(인덱스와 유사한 부분)
- Key는 List< E > 인터페이스의 인덱스와 다르게 순서 개념이 없음(인덱스와 다른 부분)
- Pair(Key-Value) 형태로 데이터가 저장되는 구조여서 Collection< E > 인터페이스를 상속받지 않고 독립적으로 정의 됨
대표적인 Map 자료구조의 컬렉션 클래스
- HashMap<K, V>가 가장 많이 사용되는 클래스
HashMap<K, V> 클래스에 대한 이해
- 다른 언어의 Dictionary와 유사한 컬렉션 클래스이다.
- Key 값이 Hash 알고리즘을 이용해 구조화 되어 있어 Key값을 이용한 검색 속도가 빠르다
- java.util 패키지에 존재한다.