[Java] Java 프로그래밍 초급
이 글은 "코드 프레소 Java 웹 개발 체험단 활동"을 통해 배운 것을 정리하는 글입니다.
네 번째 강의는 바로 "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
)
- 객체는 속성과 행위를 갖고 있고, 메소드는 객체의 행위를 정의한다.
- 메소드는 함수와 거의 유사하다.
input
과output
이 존재하며 특정 작업을 수행한다.
- 메소드는 특정 객체에 포함되어 있다. 즉, 독립적으로 존재하지 않는다.
📌 함수 ( function
)
- 특정한 작업을 수행하기 위한 코드들의 집합이다.
- 특정 작업의 코드들을 모듈화하여 필요한 경우 호출한다.
- 코드의 중복을 줄일 수 있다.
📌 메소드 vs
함수
- 함수는 독립적으로 존재하며, 특정 작업에 필요한 데이터를 모두 제공해야 한다.
- 메소드는 특정 객체 내부에서 존재하며, 객체의 멤버 변수에 대한 연산이 가능하다.
2. 메소드의 문법
- 메소드를 호출하기 위한 메소드의 이름이 존재한다.
- 특정 작업을 위한 메소드의 구현 코드가 중괄호 내부에 구현된다.
[접근제어자] 리턴타입 메소드이름(파라미터1, 파라미터2, ...) {
메소드의 구현코드;
[return 리턴값;]
}
- 메소드는
input
과output
이 존재한다.
-input
은 없거나 1개 이상의 파라미터 리스트
-output
은 없거나 리턴 값으로 표시
- 리턴 타입은 리턴되는 값의 자료형(리턴 값이 없을 경우void
)
3. 메소드의 이름
- 메소드의 이름은 행동을 표현하기 위해 보통 동사로 시작한다.
- 첫 단어는 소문자로 시작하며, 2개 이상의 단어가 결합될 경우 연결되는 단어의 첫 문자를 대문자로 표시한다.
- 메소드가 수행하는 작업을 의미있게 표현하는 이름으로 작명한다.
⭐
Point
- 메소드는 함수와 같이 특정 작업을 위한 코드들의 집합이다.
- 메소드는 함수와 다르게 특정 객체에 종속적이다.
- 메소드는
Input
과output
이 존재하고 각각 리턴값, 파라미터로 표현한다.- 메소드의 이름은 동사로 시작하며, 메소드의 행동을 명확하게 표현해야 한다.
- 객체의 메소드는 점 연산자를 사용하여 호출 가능하다.
- 객체의 메소드는 모든 데이터를 전달하지 않아도 객체의 멤버 변수에 대한 연산이 가능하다.
[ 접근 제어자의 개념 및 적용 ]
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
- 메소드는
input
과output
이 있을 수 있고 각각 파라미터와 리턴값을 의미한다.- 메소드는 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
- 메소드 오버로딩은 서로 다른 조합의 파라미터를 사용하는 동일한 이름의 메소드를 한 클래스 내부에서 사용하는 것이다.
- 의미있는 메소드의 이름을 여러 메소드에 사용할 수 있다.
- 메소드 호출 시 세팅하는 파라미터에 따라 어떤 메소드가 호출될지를 결정된다.
- 리턴 타입은 메소드 오버로딩의 조건이 되지 않는다.
- 생성자도 오버로딩 가능하다.
Author And Source
이 문제에 관하여([Java] Java 프로그래밍 초급), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mmy789/Java-Java-프로그래밍-초급저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)