본문 바로가기
카테고리 없음

24. 07. 19 개발자교육 4주차 금요일 JAVA(객체, Object-Instance)+이론

by 융기융 2024. 7. 19.
반응형

스택과 힙, 스태틱이 움직이는 원리!! 클릭해서 확대하세요^^

 

[객체[Object)] - 현실 : 식별 가능한 모든 것(속성 + 기능을 지님)


- Java : 클래스에 정의된 내용대로 new 연산자에 의해서 Heap 메모리 영역에 생성된 것


[객체 지향 언어 || 객체 지향 프로그래밍(OOP)] - 현실 세계가 객체로 이루어져 객체간의 상호작용으로 사건이 발생한다

 

파는 패러다임을 컴퓨터로 옮겨 놓은 것/ 옮겨 놓은 프로그래밍 방식


 

[클래스 (class)]

- 객체의 속성(필드), 기능(메서드)을 정의한 것 (문서/설계도)

 

[객체 지향 언어의 특징]

1. 추상화

2. 캡슐화

3. 상속

4. 다형성

 

[추상화]

- 구체적인 것을 제거하고, 공통적인 것만 남겨두는 것

--> 유연성 확보

 

[캡슐화]1) 속성, 기능을 하나로 묶어서 관리-> class{}

 

2) 데이터(속성 == 필드)의 직접 접근 제한 원칙-> 필드에서는 private 접근 제한자를 붙임-> 필드에 대한 간접 접근 방법 (getter/setter) 제공

 

[객체 생성 메모리 구조]

 

1)                   3)      2)Nation n2      =     new Nation();

 

1) Stack 메모리 영역에 Nation 자료형 변수 n2를 선언     - Nation 자료형 변수 == Nation 객체를 참조하는 참조형 변수

 

2) Heap 메모리 영역에 Nation 클래스에 정의된 내용을 토대로  객체 생성 ( 할당 )

 

- new 연산자 : Heap 메모리 영역에 새로운 객체 생성

 

3) 생성된 객체의 시작 주소를 n2 변수에 대입하여    참조할 수 있게 함

 

    - n2 자료형 == Nation       생성된 객체 자료형 == Nation

 

       같은 자료형이므로 대입 가능

 

 

[Object와 Instance의 차이]

 

ex) 현실의 존재하는 실제 물체를

객체 지향 언어를 이용해 코드로 작성해서 

new 연산자를 통해 객체로 생성

 

-> 생성된 객체는 진짜 객체?? NO !!!

 

현실에 존재하는 진짜 객체 : object

컴퓨터에 생성된 객체 : Instance

 

( + class 까지 묶어서 차이점 잘 구분하기!!! )

 

 

 

 

Cls _ pkg1 _ ClassRun1.java

package cls.pkg1;

 

public class ClassRun1 {

 

public static void main(String[] args) {

 

// public class + 같은 패키지

// ClassTest1 객체 생성 하기 -> 문제 O/X

 

ClassTest1 t1 = new ClassTest1();

t1.method();

 

// (default) class + 같은 패키지

// Default class 객체 생성 -> 문제 X

DefaultClass d1 = new DefaultClass();

d1.method();

}

 

}

 

Cls _ pkg1 _ ClassTest1.java

package cls.pkg1;

 

/* class : 객체의 속성, 기능을 정의한 문서( == 설계도)

*

* --------------------------------------

* [class 작성법]

*

* [접근제한자] class 클래스명{

*

* // 필드(속성 == 변수)

*

* // 기능1(생성자)

*

* // 기능2(메서드)

*

* }

* ---------------------------------------------------

*

* [[ class 작성 시 알아야 할 것 !! ]]

*

* - class 명은 꼭 대문자로 시작!! (카멜 표기법)

*

* - 접근 제한자

*

* 1) [+] public

* - 뜻 : 공공의, 모두의

* - 같은 프로젝트에서 어디서든 접근 가능

*

* - public class :

* 같은 프로젝트에서 누구든지 해당 클래스를

* 가져가서(import)해서 사용할 수 있음

*

* 2) [~] (default)

*

* - () == 생략을 의미 -> class 왼쪽에 아무것도 안적음

*

* - 같은 패키지에서만 접근 가능

* -> 다른 패키지 클래스에서 import 불가

*

*/

 

public class ClassTest1 {

 

public void method() {

System.out.println("public은 어디서는 접근 가능");

}

 

}

 

Cls _ pkg1 _ DefaultClass.java

package cls.pkg1;

 

// (dafault) 클래스 : 같은 패키지만 접근 가능

class DefaultClass {

 

public void method() {

System.out.println("(default)는 같은 패키지만 접근 가능");

}

}

 

 

Cls _ pkg2 _ ClassRun2.java

package cls.pkg2;

 

import cls.pkg1.ClassTest1;

//import cls.pkg1.DefaultClass;

 

public class ClassRun2 {

public static void main(String[] args) {

 

// public class + 다른 패키지

// ClassTest1 객체 생성 하기 -> 문제 X

 

ClassTest1 t1 = new ClassTest1();

t1.method();

 

// (default) class + 같은 패키지

// Default class 객체 생성 -> 문제

 

// DefaultClass d1 = new DefaultClass();

// d1.method();

 

}

 

}

 

Constructor _ Member.java

package constructor;

 

public class Member {

 

/* 필드 */

 

// 인스턴스 변수 : 객체 생성시 할당되는 변수

private String memberId; // 아이디

private String memberPw; // 비밀번호

private String memberName; // 회원 이름

private int memberAge; // 나이

 

// 인스턴스 변수에 대입되는 값이 없다면

// 각 자료형의 기본 값으로 초기화 된다!!

// ex) int : 0 / double : 0.0 / boolean : false

// 참조형 : null

 

/* null : 현재 참조하고 있는 객체가 없음 의미*/

 

/* 생성자 */

/* -- 작성 규칙 --

* 1. 반환형 없음(void, String, int .. . . . .안씀)

*

* 2. 생성자 이름은 클래스명와 동일

*/

 

/** 기본 생성자

* - 매개 변수가 없는 생성자를 의미

*

* *중요*

* - 클래스에 생성자가 "하나도" 없을 경우

* 컴파일러가 컴파일시 기본 생성자를 추가해줌

* ex) public Member(){}

* */

public Member() {

 

// this() 생성자 : 다른 생성자 호출(재활용)

// -> [주의사항] : 반드시 생성자 첫 번째 줄에 작성!!!!!!

this("ID","PW","NAME", 100);

 

// Member 객체가 생성될 때 println() 구문을 수행

System.out.println("***** Member 객체 생성됨 *****");

}

 

/** 매개 변수 생성자

* - 매개 변수가 존재하는 생성자

*

* - 전달 받은 매개 변수를 이용해

* 생성되는 객체의 필드를 초기화 하는 용도로 많이 사용

*/

 

public Member(String memberId,

String memberPw,

String memberName,

int memberAge) {

 

// ** 오버로딩 적용!!! -> 매개 변수의 개수가 다름

 

// this : 여기/이것 --> 현재 객체

 

this.memberId = memberId;

this.memberPw = memberPw;

this.memberName = memberName;

this.memberAge = memberAge;

// -> setter 4개를 합친 모양

}

 

// 변수명 중복 테스트

// int num = 10;

// int num = 10;

// Duplicate field Member.num ->중복 X

 

// 메서드명 중복 테스트

public void method() {}

// public void method() {} // 동일하게 작성 -> 중복 O

// private void method() {} // 접근 제한자 다름 -> 중복O

// public String method() {} // 반환형 다름 -> 중복O

 

/* 오버로딩 (Overloading, 과적)

*

* - 하나의 클래스에 동일한 이름의 메서드를 여러 개 작성하는 기법

*

* - 같은 이름의 메서드가 수행하는 기능은 기본적으로 같으나

* 전달 받은 매개 변수에 따라 조금씩 동작이 달라야 하는 경우

* 상황별로 메서드를 정의할 수 있음

*

* ex)

* public void sum(int a, int b){ a + b 출력; }

*

* public void sum(int a, int b, int c){ a + b + c 출력;}

*

* *** 오버로딩 성립 조건 ***

* 1) 메서드의 이름이 똑같아야 한다

* 2) 매개 변수의 개수, 자료형, 자료형 순서 중 하나라도 달라야 함

* */

 

public void method(int a) {} // 매개 변수 개수 다름

public void method(int a, String b) {} // 매개 변수 개수 다름

public void method(String b, int a) {} // 자료형 순서 다름

public void method(String b, long a) {} // 자료형 다름

 

/* 메서드 */

// getter

public String getMemberId() {

return memberId;

}

 

public String getMemberPw() {

return memberPw;

}

 

public String getMemberName() {

return memberName;

}

 

public int getMemberAge() {

return memberAge;

}

 

// setter

public void setMemberId(String memberId) {

this.memberId = memberId;

}

 

public void setMemberPw(String memberPw) {

this.memberPw = memberPw;

}

 

public void setMemberName(String memberName) {

this.memberName = memberName;

}

 

public void setMemberAge(int memberAge) {

this.memberAge = memberAge;

}

 

/**

* 현재 객체가 가지고 있는 필드값 모두 출력하는 메서드

*/

public void inform() {

System.out.println("\n--------------------------");

System.out.println("memberId : " + memberId);

System.out.println("memberPw : " + memberPw);

System.out.println("memberName : " + memberName);

System.out.println("memberAge : " + memberAge);

System.out.println("--------------------------\n");

}

 

}

Constructor _ MemberRun.java

package constructor;

 

public class MemberRun {

public static void main(String[] args) {

 

// Member 객체 생성 1 : 생성 후 setter로 값 초기화

 

Member mem1 = new Member();

// Member() 기본 생성자

// -> Member 클래스에 작성되어 있음

 

// mem1이 참조하는 객체의 setMemberId()메서드 호출

mem1.setMemberId("member01");

mem1.setMemberPw("pass01");

mem1.setMemberName("김회원");

mem1.setMemberAge(27);

 

mem1.inform(); // mem1이 참조하는 객체 필드 값 출력

 

// -----------------------------------------------

 

// Member 객체 생성 2 : 매개 변수 생성자 이용

 

Member mem2 = new Member("member02", "pass02", "최회원", 22);

// -> 객체가 만들어지면서 동시에

// 생성자에 의해서 필드 값이 초기화 된다!!!

 

// setter 방법 5줄 -> 생성자 방법 1줄

 

mem2.inform();

 

// ** 매개 변수 생성자로 얻은 효과**

// -> 코드 길이 감소 (== 재사용성 증가)

 

// -----------------------------------------------------------

 

// this() 생성자 확인

Member mem3 = new Member();

mem3.inform();

}

 

}

 

06_object_array -> dto _ MemberDTO.java

package dto;

 

// DTO(Data Transfer Object) : 데이터 전달용 객체

// - 전달될 데이터를 묶어서 관리하는 객체

 

public class MemberDTO {

 

// 필드 작성

private String memberId;

private String memberPw;

private String memberName;

private int memberage;

 

// 생성자

 

// [이클립스의 생성자 자동완성 기능]

// 상단 source 메뉴

// 또는 alt + shift + s -> 컨텍스트 메뉴에서

// Generate Constructor Using Fields... (단축기 o)

 

public MemberDTO() {} // 기본 생성자(매개 변수 없음!!!)

 

public MemberDTO(String memberId, String memberPw, String memberName, int memberage) {

this.memberId = memberId;

this.memberPw = memberPw;

this.memberName = memberName;

this.memberage = memberage;

}

 

// [이클립스의 생성자 자동완성 기능]

// 상단 source 메뉴

// 또는 alt + shift + s -> 컨텍스트 메뉴에서

// Generate Getters and Setters... 선택 (단축키 r)

 

public String getMemberId() {

return memberId;

}

 

public void setMemberId(String memberId) {

this.memberId = memberId;

}

 

public String getMemberPw() {

return memberPw;

}

 

public void setMemberPw(String memberPw) {

this.memberPw = memberPw;

}

 

public String getMemberName() {

return memberName;

}

 

public void setMemberName(String memberName) {

this.memberName = memberName;

}

 

public int getMemberage() {

return memberage;

}

 

public void setMemberage(int memberage) {

this.memberage = memberage;

}

 

/**

* 현재 객체가 가지고 있는 필드값 모두 출력하는 메서드

*/

public void inform() {

System.out.println("\n--------------------------");

System.out.println("memberId : " + memberId);

System.out.println("memberPw : " + memberPw);

System.out.println("memberName : " + memberName);

System.out.println("memberAge : " + memberage);

System.out.println("--------------------------\n");

}

 

}

 

06_object_array -> run _ ObjectArrayRun.java

package run;

 

import service.MemberService;

 

public class ObjectArrayRun {

 

public static void main(String[] args) {

 

// MemberService 객체 생성

// -> Memberservice 생성자를 작성한 적 없다!!!

// --> 그러면 컴파일러가 만들어준다~~!!

MemberService service = new MemberService();

 

service.method1();

}

 

}

 

06_object_array -> service _ MemberService.java

 

package service;

 

import dto.MemberDTO;

 

// Service(제공하다)

// 필요한 기능(비지니스 로직)

 

public class MemberService {

 

/* 객체 배열

* - 객체를 참조하는 참조형 변수를 묶음으로 다루는 것

*

* [작성법]

* 클래스명[] 변수명 = new 클래스명[크기];

*

* ex)

* Academy[] arr = new Academy[3];

*

* - new Academy[3] :

* heap 영역에 Academy "참조형 변수" 3칸짜리 묶음 배열

*

* --> 각 칸이 Academy "참조형 변수"

* --> 각 칸이 Academy 객체 주소를 저장해서 참조

*/

 

/** 객체 배열 생성/초기화/활용 */

public void method1() {

 

// MemberDTO 참조형 변수 3칸짜리 배열을 생성하고

// memberArr가 참조

MemberDTO[] memberArr = new MemberDTO[3];

 

// memberArr가 참조하는 배열의 각 인덱스 번째 칸은

// MemberDTO "참조형 변수" 이다 !!!

 

// 인덱스별로 MemberDTO 객체로 초기화

memberArr[0] = new MemberDTO("member1", "pass01", "일번회원", 30);

memberArr[1] = new MemberDTO("member2", "pass02", "회원투", 22);

memberArr[2] = new MemberDTO("member3", "pass03", "삼순이", 33);

 

// memberArr의 요소가 참조하는 모든 MemberDTO 객체의

// 저장된 필드 정보를 출력

 

// memberArr[0].inform();

// memberArr[1].inform();

// memberArr[2].inform();

 

/* 객체 배열 + for 문 */

 

// 일반 for문

for(int i=0 ; i<memberArr.length; i++) memberArr[i].inform();

 

System.out.println("-------------------------------------------------");

System.out.println("-------------------------------------------------");

 

// 향상된 for문

for( MemberDTO mem : memberArr ) mem.inform();

 

}

 

}

 

반응형