객체지향언어
- 현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있다.
- 모든 사건들은 객체와 객체간의 상호작용으로 이루어져있다.
=> 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다
자바에서 객체란?
- 클래스에 정의된 내용대로(작성해 놓은대로) 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 |