객체지향언어
- 현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있다.
- 모든 사건들은 객체와 객체간의 상호작용으로 이루어져있다.
=> 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다
자바에서 객체란?
- 클래스에 정의된 내용대로(작성해 놓은대로) new 연산자를 통해 heap 메모리에 생성된 것을 말한다.
(heap의 공간자체)
클래스의 등장 배경
- 데이터를 많이 다루기 위해 구조체가 탄생하였다.
- 변수(한개의 데이터) → 배열(한개의 자료형) → 구조체(여러개의 자료형, 데이터
- 사용자가 정의한 내용들을 외부로부터의 데이터 접근을 제한 시켜 변경을 못하도록 한다.
하지만 값의 확인조차 하지 못하기에 의미가 없다.
클래스
- 객체의 특성(속성 + 기능)에 대한 정의를 한 것으로 속성(객체를 나타낼 수 있는 특징)들을 가진다. (클래스는 틀이고, new를 만나야 heap에 할당)
- 속성(필드): 관리될 수 있는 특징
이름이라는 속성에 김지호라는 속성값을 대입
- 속성(필드): 관리될 수 있는 특징
- 메소드들은 속성들이 가질 수 있는 기능
추상화
- 목적 : 유연성을 확보하기 위해 - (유연성 : 여러 상황과 환경에 적응을 잘할수 있는)
- 구체적인 것은 제거하고 공통점을 추출하고 공통되지 않은 부분은 제거해서 코드를 작성(클래스는 단지 소스코드) - 사용하려면 메모리를 할당해야하는데 그것을 객체
추상화 예시) 회원정보관리프로그램 - 회원객체
- 속성 : 이름, 아이디, 패스워드, 주소, 생년월일, 성별 → 변수
- 클래스를 설계하기 위해 공통부분을 추출하고 클래스 다이어그램을 만든다.
- 클래스 다이어그램 : 회원
Member |
-name : String -id : string -pwd : String -add : String -birth : int |
-> 다이어그램을 바탕으로 클래스 생성
public class Member{
private String name;
private String id;
private String pwd;
private String address;
private int birth;
private char gender;
} //객체 -> 자료형의 묶음
public static void main(String[] args) {
new Member(); -> heap영역에 생성
Member m = new Member(); -> m이라는 레퍼런스 변수에 대입(스택에 생성)
//사용자(개발자) 정의의 자료형 -> 데이터를 보관할 방식
}
객체란?
- 현실에 존재하는 독립적이면서 하나로 취급되는 사물이나 개념을 말한다.
- 객체 지향 언어에서 객체의 개념은 클래스에 의해 메모리에 할당된 결과물(Object)이다.
public class Member{
private String name;
private String id;
private String pwd;
private int age;
}
public static void main(String[] args) {
Member m1 = new Member();
m1 = new Member("user01", "pass01", "김채원", 24);
Member m2;
m2 = new Member("user02", "pass02", "홍길동", 20);
//m1와 m2가 각각 heap영역에 생성된다. 값이 같아도 다른 객체이다.
}
객체의 할당
Stack | heap |
Member [ 0x1234 ]m1 Member [ 0x5678 ]m2 |
0x1234 [ id | pwd | name | age ] user01 pass01 김채원 24 0x5678 [ id | pwd | name | age ] user02 pass02 홍길동 20 |
-> m1은 Member객체의 주소만 보관가능하다.
클래스와 객체의 차이점?
- 클래스는 객체에 대한 특성을 정의한것이고, 객체는 값을 넣어 heap영역에 만들어놓은 공간을 말한다. (heap 영역에 할당된 공간을 인스턴스라고 한다.)
인스턴스화 클래스를 객체화 시키는것
객체지향의 3대 원칙(oop)
- 캡슐화(encapsulation)
- 상속 (inheritance)
- 다형성 (polymorphism)
+ 추상화
캡슐화
- 추상화를 통해 정리된 데이터들과 기능을 하나로 묶어 관리하는 기법
public static void main(String[] args) {
Member m = new Member();
//현재 맴버 객체의 값 출력
//기본생성자를 호출하여 객체를 생성하게 되면
//JVM이 지정한 기본값으로 초기화가 된다.
System.out.println("memberId : " + m.getMemberId());
System.out.println("memberPwd : " + m.getMemberPwd());
System.out.println("memberName : " + m.getMembername());
System.out.println("age : " + m.gerAge());
System.out.println("gender : " + m.getGender());
System.out.println("phone : " + m.getPhone());
System.out.println("email : " + m.getEamil());
//setter로 값 변경
m.setMemberId("user01");
m.setMemberPwd("pass01");
m.setMemberName("홍길동");
m.setAge(20);
m.setGender('M');
m.setPhone("010-7660-7771");
m.setEamil("hong123@kh.or.kr");
//getter로 변경된 값 출력
System.out.println("변경 후 memberId : " + m.getMemberId());
System.out.println("변경 후 memberPwd : " + m.getMemberPwd());
System.out.println("변경 후 memberName : " + m.getMembername());
System.out.println("변경 후 age : " + m.gerAge());
System.out.println("변경 후 gender : " + m.getGender());
System.out.println("변경 후 phone : " + m.getPhone());
System.out.println("변경 후 email : " + m.getEamil());
}
캡슐화 원칙(클래스를 작성하는 원칙)
- 클래스의 가장 중요한 목적인 데이터의 접근제한을 원칙(private)으로 하여 클래스 외부에서 데이터의 직접 접근을 막고, 대신 데이터를 처리하는 함수들을 클래스 내부에 작성하는 방법.
- 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성한다.
- 멤버 함수는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.
public class Member {
private String memberId;
private String memberPwd;
private String memberName;
private int age;
private char gender;
private String phone;
private String email;
//기본생성자(default constructor) : ()안에 아무것도 없는 생성자
//객체를 생성하기 위해서 사용한다.
public Member() {}
setter 메소드
- 필드에 있는 값을 변경할 목적으로 사용한다.
- 전달받은 값으로 필드값을 변경
//setter 메소드
//필드값 변경을 위해 사용하는 메소드이다.
//괄호 안에 선언된 변수를 매개변수라고 하며,
//전달받은 매개변수 값으로 필드 값을 변경한다.
public void setMemberId(String memberId) {
/*memberId = changeMemberId;*/
//필드명과 지역변수가 같은 이름이면 지역변수가 우선권을 가진다.
//같은 이름의 필드를 사용할 때는 this.을 명시해야 한다.
this.memberId = memberId; //내 자신 주소의 memberId
}
public void setMemberPwd(String memberPwd) {
this.memberPwd = memberPwd;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
/*return;*/ //JVM이 기본생성자와 return을 자동으로 추가해줌
}
public void setAge(int age) {
this.age = age;
}
public void setGender(char gender) {
this.gender = gender;
}
public void setPhone(String phone) {
this.phone = phone;
}
public void setEamil(String email) {
this.email = email;
// void -> return;
}
getter 메소드
- 필드에 접근자체를 하지 못하기 때문에 값을 넘기는 메소드
- public 필드자료형 getBalance() { return balance; }
- return 필드명; → 돌아갈때 필드명이 가지고 있는 값을 가지고 되돌아온다
//getter 메소드
//필드에 직접 접근하여 값을 알 수 없기 때문에,
//해당 객체가 가진 값을 알고 싶을 때는 getter메소드를 사용한다.
public String getMemberId() {
return /*this.*/memberId; //JVM이 추가해준다.
//String 값을 return하겠다.
}
public String getMemberPwd() {
return memberPwd;
}
public String getMembername() {
return memberName;
}
public int gerAge() {
return age;
}
public char getGender() {
return gender;
}
public String getPhone() {
return phone;
}
public String getEamil() {
return email;
}
UML 다이어그램
- Full 클래스명 : com.kh.member .model.vo.Member
- 필드 : - memberId : String
- memberPwd : String
- memberName : String
- age : int
- gender : char
- phone : String
- email : String
- 생성자 : + Member() // 클래스명과 동일하다.
- 메소드 : + setter()/getter()
- 관계 : main 메소드에서 Member 객체를 만들어서 사용한다.
- Dependency 의존 : 메소드 내애서 다른 클래스를 사용할때
JVM이 자동으로 추가해주는 것들
- 기본생성자
- setter의 return
- import java.lang.*;
- getter의 this.
'JAVA > 이론 정리 및 예제' 카테고리의 다른 글
[JAVA/자바] #6_3 필드(field)/ 예제 (0) | 2021.09.14 |
---|---|
[JAVA/자바] #6_2 클래스 (0) | 2021.09.14 |
[JAVA/자바] #5_2 mainArgument (0) | 2021.09.14 |
[JAVA/자바] #5_1 2차원배열 / 예제 (0) | 2021.09.14 |
[JAVA/자바] #4_4 배열 실습문제 (0) | 2021.09.14 |