JAVA/이론 정리 및 예제

[JAVA/자바] #6_1 객체지향언어 / 예제

chaewon 2021. 9. 14. 16:09

객체지향언어

  • 현실세계는 사물이나 개념처럼 독립되고 구분되는 각각의 객체로 이루어져 있다.
  • 모든 사건들은 객체와 객체간의 상호작용으로 이루어져있다.
    => 컴퓨터로 옮겨 놓아 만들어낸 것이 객체지향 언어이다

자바에서 객체란?

  • 클래스에 정의된 내용대로(작성해 놓은대로) 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)

  1. 캡슐화(encapsulation)
  2. 상속 (inheritance)
  3. 다형성 (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이 자동으로 추가해주는 것들

  1. 기본생성자
  2. setter의 return
  3. import java.lang.*;
  4. getter의 this.