210707 수
객체
Chap01 객체지향언어
1. 객체지향 4대 (3 + 1) 특징
1> 캡슐화
2> 상속
3> 다형성
+
4> 추상화
2. 객체 지향 언어
*객체(Object)
=> 현실 세계에 존재하는 독립된 개체들을 컴퓨터로 옮겨 놓은 것
*OOP(Object-Oriented Programming)
: 객체 지향적인 프로그래밍
-JAVA는 객체지향 언어이다.
*객체지향 vs 절차 지향
1) 객체 지향
: 내가 수행하고자 하는 기능을 객체 단위로 명시한다.
-모듈화되어 있어서 재사용성이 높다.
-프로그램 안에 객체를 도입한 것
2) 절차 지향
: 내가 수행하고자 하는 기능을 절차적으로 명시한다.
-응용이 어렵다
*자바에서 객체란?
클래스에 정의된 내용대로 new연산자를 통해 메모리 영역에 생성된 것
1) 클래스
: 하나의 설계도, 틀과 같다.
-객체의 특성에 대한 정의를 한 것
-클래스 안의 속성과 기능을 묶어서 클래스를 만듦.
2) 클래스 작성 시 반드시 필요한 것
: 반드시 추상화, 캡슐화가 적용되어야 함.
Q. 클래스의 등장 배경 => 다시 정리
*추상화
: 그 클래스가 가져야 할 정확한 속성과 기능을 걸러낸다.
3) 클래스 구성
(1) 필드부
접근제한자[예약어] 자료형 변수명;
(2) 생성자부
(3) 메소드부
<입력>
public class Student {
// Student가 가질 수 있는 속성을 정의했다.
// 필드부
// 접근제한자[예약어] 자료형 변수명;
public String name;
public int kor;
public int math;
public int eng;
// 생성자부
// 메소드부
<실행>
public class Run {
public static void main(String[] args) {
Student lim = new Student();
lim.name = "임주희";
lim.kor = 100;
lim.math = 95;
lim.eng = 90;
System.out.println(lim.name + "님의 국어 점수는" + lim.kor + "이고, 수학 점수는 "
+lim.math + "이며, 영어 점수는" + lim.eng + "입니다");
// => 직접 접근을 통해 값 가져오기
// 임주희 객체를 관리하기 위해서는 lim이라는 레퍼런수 변수만 알면 된다
Student dong = new Student();
dong.name = "홍길동";
dong.kor = 30;
dong.math = 40;
dong.eng = 50;
System.out.println(dong.name + "님의 국어 점수는" + dong.kor + "이고, 수학 점수는 "
+ dong.math + "이며, 영어 점수는" + dong.eng + "입니다");
// ***여기서 발생할 수 있는 문제***
//public이라는 접근 제한자로 명시된 필드 값은
//클래스 외부에서도 직접 접근을 통해 값을 변경시킬 수 있음
// => 캡슐화 작업 필요
}
답 임주희님의 국어 점수는100이고, 수학 점수는 95이며, 영어 점수는90입니다 홍길동님의 국어 점수는30이고, 수학 점수는 40이며, 영어 점수는50입니다 |
Public으로 작성된 필드 값은 클래스 외부에서 접근하여 값을 변경시킬 수 있기 때문에 캡슐화 작업이 필요하다
*캡슐화
: 추상화를 통해 정리된 데이터들과 기능들을 하나로 묶어서 관리하는 기법.
클래스의 가장 중요한 목적인 데이터의 접근 제한을 원칙으로 하여 클래스 외부에서 데이터의 직접 접근을 막고 대신 데이터를 처리하는 함수들을 클래스 내부에 작성하는 방법.
1) 캡슐화 원칙
(1) 클래스의 멤버 변수에 대한 접근 권한은 private를 원칙으로 한다.
(2) 클래스의 멤버 변수에 대한 연산처리를 목적으로 하는 함수들을 클래스 내부에 작성한다.
(3) 멤버 함수는 클래스 밖에서 접근할 수 있도록 public으로 설정한다.
2) 캡슐화 방법
(1) 정보 은닉(private)
-추상화를 통해 선정된 속성들(멤버 변수)에 외부로부터의 직접 접근을 막기 위해 private 접근 제한자 사용
(2) getter/setter 메소드
-간접적으로 접근하여 값을 기록하고 조회해오는 메소드를 추가
<입력>
package com.kh.chap02_encapsulation.model.vo;
public class Student {
//1. 필드
private String name;
private int kor;
private int math;
private int eng;
// 2. 생성자 : 객체를 생성하기 위한 일종의 메소드
// 접근제한자 클래스명([매개변수]) {}
public Student() {}
//반드시 클래스 명칭과 동일하게 작성해줘야 한다
// 3. 메소드 : 기능을 구현하는 부분
// 접근제한자 반환형 메소드명([매개변수]){}
// 3_1. setter : 데이터(필드)들을 기록 및 수정하는 기능을 하는 메소드
public void setName(String name) { //Student 객체의 이름을 변경하는 메소드
this.name = name;
}
public void setKor(int kor) {
this.kor = kor;
}
public void setMath(int math) {
this.math = math;
}
public void setEng(int eng) {
this.eng = eng;
}
// 3_2. getter : 값을 반환해주는 기능을 하는 메소드
public String getName() { //Student 객체의 이름을 반환하는 메소드
return name;
}
public int getKor() {
return kor;
}
public int getMath() {
return math;
}
public int getEng() {
return eng;
}
//해당 객체의 모든 필드 값을 합친 문자열을 반환하는 메소드
public String information() {
return "이름 : " + name + ", 국어 점수 : " + kor + ", 수학점수 : " + math
+ ", 영어 점수 : " + eng;
}
}
요약
0. 클래스 생성
public class Student {
1. 필드부
접근제한자[예약어] 자료명 변수명;
private String name;
private int kor;
private int math;
private int eng;
2.생성자부 : 객체를 생성하기 위한 일종의 메소드
접근제한자 클래스명(매개변수){}
public Student(){}
*반드시 클래스 명칭과 동일하게 써야 한다.
3. 메소드부 : 기능 구현 부분
접근제한자 반환형 메소드명(매개변수){}
3_1. setter : 데이터(필드)들을 기록 및 수정하는 기능을 하는 메소드
public void setName(String name) {
this.name = name;
}
public void setKor(int kor) {
this.kor = kor;
}
...
*void : 반환할 값이 없다는 뜻
*this. : 해당 객체의 주소값이 담겨 있음
3_2. getter : 값을 반환해주는 기능을 하는 메소드
public String getName() {
return name;
}
public int getKor() {
return kor;
}
4. 해당 객체의 모든 필드 값을 합친 문자열을 반환하는 메소드
public String information() { return "이름 : " + name + ", 국어 점수 : " + kor + ", 수학점수 : " + math + ", 영어 점수 : " + eng; }
<실행>
package com.kh.chap02_encapsulation.run;
import com.kh.chap02_encapsulation.model.vo.Student;
public class Run {
public static void main(String[] args) {
Student st = new Student();
// 1) 객체의 값 설정 -> setter 메소드 호출(간접 접근)
st.setName("부승관");
st.setKor(100);
st.setMath(95);
st.setEng(90);
// 2) 객체의 값 알아오기 -> getter 메소드 호출(간접 접근)
System.out.println("이름 : " + st.getName());
System.out.println("국어 점수 : " + st.getKor());
System.out.println("수학 점수 : " + st.getMath());
System.out.println("영어 점수 : " + st.getEng());
//한번에 모든 필드 값을 확인할 수 있는 information 이라는 메소드 만들어서 호출
System.out.println(st.information());
}
}
답 이름 : 부승관 국어 점수 : 100 수학 점수 : 95 영어 점수 : 90 이름 : 부승관, 국어 점수 : 100, 수학점수 : 95, 영어 점수 : 90 |
*객체 할당
: new 연산자와 생성자를 사용하여 객체 생성 시 Heap 메모리 영역에 서로 다른 자료형의 데이터가 연속으로 나열/할당된 객체 공간
*객체 = 인스턴스
<클래스 다이어그램 이해하기>
Chap2. 클래스
1. 클래스
1) 클래스 선언(구성)
[접근제한자][예약어] class 클래스명{
필드부 설정
생성자부 설정
메소드부 설정
}
2) 클래스 다이어그램
3) 클래스 예시
(1) 필드 : 필드부를 구성한다 = 멤버 변수를 정의한다
(2) 생성자
(3) 메소드 : 멤버 함수를 정의한다
*멤버(전역) 변수 vs 지역 변수
-멤버 변수 : 메소드 영역 외에 정의된 변수
-지역변수 : 메소드 영역 안에 정의된 변수
4) 클래스 접근 제한자
1> 접근 제한자 public을 사용하는 경우
package com.kh.chap03_class.model.vo;
//클래스에서 사용 가능한 접근 제한자 -> public, default(생략)
public class Person {
private String id;
private String pwd;
private String name;
private int age;
private char gender;
private String phone;
private String email;
public Person() {}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String information() {
return id + " " + pwd + " " + name + " " + age + " " + gender + " "
+ phone + " " + email;
}
}
=> 다른 패키지에서도 사용이 가능하다
package com.kh.chap03_class.run;
import com.kh.chap03_class.model.vo.Person;
public class Run {
public static void main(String[] args) {
//다른 패키지에 있는 Person이라는 클래스를 이용해 객체 생성하기
Person p = new Person();
p.setId("user01");
p.setPwd("pass01");
p.setName("부승관");
p.setAge(20);
p.setGender('F');
p.setPhone("010-1234-5678");
p.setEmail("bylm@iei.or.kr");
System.out.println(p.information());
}
}
답 user01 pass01 부승관 20 F 010-1234-5678 bylm@iei.or.kr |
2> 접근 제한자 default를 사용하는 경우
package com.kh.chap03_class.model.vo;
//클래스에서 사용 가능한 접근 제한자 -> public, default(생략)
class Person {
private String id;
private String pwd;
private String name;
private int age;
private char gender;
private String phone;
private String email;
...
=> 같은 패키지에서 실행해줘야 한다.
package com.kh.chap03_class.model.vo;
public class Run {
public static void main(String[] args) {
//다른 패키지에 있는 Person이라는 클래스를 이용해 객체 생성
//접근 제한자를 default로 변경할 경우 Person클래스와
//다른 패키지에 있어 인식 불가 => 존재하지않는 클래스라는 에러 발생
Person p = new Person();
p.setId("user01");
p.setPwd("pass01");
p.setName("우별림");
p.setAge(20);
p.setGender('F');
p.setPhone("010-1234-5678");
p.setEmail("bylm@iei.or.kr");
System.out.println(p.information());
}
}
Chap03
1. 필드
1) 필드 표현식
[접근제한자][예약어] 자료형 변수명 [=초기값];
2) 필드 접근제한자
<필드부 접근제한자 테스트>
package com.kh.chap04_field.model.vo;
//필드 접근 제한자 테스트용 클래스
public class FieldTest1 {
//1. 필드
public String pub = "public";
protected String pro = "protected";
/*default*/ String def = "default" ; //default는 예외적으로 접근 제한자를 안 써주는 것이 디폴트값
private String pri = "private" ;
//2. 생성자
public FieldTest1() {}
//3. 메소드(getter/setter)
//pub => 직접 접근이 가능하므로 getter/setter 정의 불필요
public String getPro() {
return pro;
}
public void setPro(String pro) {
this.pro = pro;
}
public String getDef() {
return def;
}
public void setDef(String def) {
this.def = def;
}
public String getPri() {
return pro;
}
public void setPri(String pri) {
this.pri = pri;
}
}
1> 다른 패키지에서 실행
public class Run {
public static void main(String[] args) {
//1. FieldTest1 => 다른 패키지에서 접근할 경우 public외에는 모두 직접 접근 불가
FieldTest1 ft1 = new FieldTest1();
//public
System.out.println(ft1.pub);
//protected
//System.out.println(ft1.pro);
System.out.println(ft1.getPro());
//default
//System.out.println(ft1.def);
System.out.println(ft1.getDef());
//private
//System.out.println(ft1.pri);
System.out.println(ft1.getPri());
}
}
=> 다른 패키지에서 접근할 경우 public 외에는 모두 직접 접근이 불가능해서 getPri를 사용했다.
2> 같은 패키지에서 실행
package com.kh.chap04_field.model.vo;
public class Run {
public static void main(String[] args) {
// TODO Auto-generated method stub
//1. FieldTest1 => 다른 패키지에서 접근할 경우 public외에는 모두 직접 접근 불가
FieldTest1 ft1 = new FieldTest1();
//public
System.out.println(ft1.pub);
//protected
System.out.println(ft1.pro);
System.out.println(ft1.getPro());
//default
System.out.println(ft1.def);
System.out.println(ft1.getDef());
//private
//System.out.println(ft1.pri);
System.out.println(ft1.getPri());
}
}
답 public protected protected default default protected |
=> 다른 패키지와 달리 private를 제외하고 모두 접근이 가능하다.
'웹개발 수업 > JAVA' 카테고리의 다른 글
[Day +13]객체 / 오버로딩, 메소드, 객체배열 (0) | 2021.07.11 |
---|---|
[Day +12]객체 / 필드, 전역변수, 지역변수, 매개변수, 예약어(static, final), 생성자, 오버로딩 (0) | 2021.07.11 |
[Day +9]배열2 (0) | 2021.07.11 |
[Day +8] 배열1 (0) | 2021.07.11 |
[Day +7]분기문 (0) | 2021.07.11 |