
[객체[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();
}
}