티스토리 뷰
출처 : DO IT! 자바프로그래밍 (저 : 박은종)
Class
class는 객체의 속성과 기능을 코드로 구현한 것이다.
class를 정의하기 위해서는 클래스 이름, 맴버변수, 메서드가 있어야한다.
클래스 이름 - 반드시 대문자로 시작한다.
맴버변수 - 속성(property), 특성(attribute) 라고 표현한다.
맴버변수의 속성에 따라 자료형을 선언해준다. (int / String ...)
변수의 자료형은 기본 자료형과 참조 자료형이 있다.
기본 자료형 (int / long / float / double ...) , 참조 자료형 (String / Date / Student(직접 만듦) ...)
메서드
클래스의 맴버변수를 이용해 함수처럼 활용하는 것, 클래스 기능을 구현하는 것
# 클래스와 인스턴스
main() 함수 - 프로그램을 실행하기 위해서는 main 함수가 반드시 있어야한다.
클래스 내부에 만들지만, 클래스의 메서드는 아니다.
main 함수에서 클래스를 사용하는 방법
1. 만든 클래스 내부에서 main 함수를 만드는 것
2. 외부에 테스트용 클래스를 만들어 사용하는 것
# new 예약어로 클래스 생성
클래스를 사용하기 위해서는 클래스를 생성해야한다.
클래스형 변수 이름 = new 생성자; -> Student st1 = new Student();
사용할 수 있도록 생성된 클래스를 '인스턴스' 라고 한다.
인스턴스를 가리키는 클래스형 변수를 '참조변수' 라고 한다. st1을 참조변수 라고 한다.
# 인스턴스와 참조 변수
객체는 '의사나 행위가 미치는 대상' 이며 이를 코드로 구현한 것이 class이다.
클래스가 메모리 공간에 생성된 상태를 '인스턴스' 라고 한다.
이렇게 생성된 클래스의 인스턴스를 '객체' 라고 한다.
참조변수 사용 -
참조변수를 사용하여 인스턴스의 맴버 변수와 메서드를 참조하여 사용할 수 있다.
사용하기 위해서는 '.' 도트 연산자를 사용해야한다.
참조변수.맴버 변수 st1.studentName;
참조변수.메서드 st1.getStudentName;
# 인스턴스와 힙 메모리
new 예약어를 사용하여 인스턴스를 생성하면 생성된 인스턴스는 맴버 변수를 갖고 있다.
이 맴버 변수는 힙 메모리(heap memory)에 생성된다.
자바 이름 짓기
클래스 이름 - 대문자로 시작
하나의 자바 파일에 여러 개의 클래스가 있더라도 public 클래스는 단 하나! public 클래스 이름과 java 파일의 이름은 같아야한다.
패키지 이름 - 소문자
## 생성자
생성자는 클래스를 처음 만들 때 멤버 변수나 상수를 초기화하는 일을 한다.
디폴트 생성자 :
- 생성자 이름 = 클래스 이름 -> 반환값이 없다.
- 만들어진 생성자가 없을 경우에만 디폴트 생성자가 실행된다.
생성자 만들기 :
- 멤버 변수에 대한 값들을 매개변수로 받아서 인스턴스가 새로 생성될 대 멤버 변수 값들을 초기화 하기 위해서
생성자 오버로드 (constructor overload)
public class Person {
String name;
float height;
float weight;
public Person() {
}
public Person(String pname) {
name = pname;
}
public Person(String pname, float pheight, float pweight) {
name = pname;
height = pheight;
weight = pweight;
}
}
생성자 이름은 같지만 하나는 디폴트 생성장이고 하나는 만든 생성자이다.
만든 생성자는 매개변수를 받아야 하는 생성자로써 디폴트 생성자와는 다르다.
이를 똑같은 이름의 생성자이지만 다르기에 생성자 오버로드라고 부른다.
코드
public class Person {
String name;
float height;
float weight;
public Person() {
}
public Person(String pname) {
name = pname;
}
public Person(String pname, float pheight, float pweight) {
name = pname;
height = pheight;
weight = pweight;
}
public String getPerson() {
return name;
}
public void setPerson(String pname) {
name = pname;
}
public void showPerson() {
System.out.println(name + " - 키 : " + height + " 몸무게 : " + weight);
}
public class PersonTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.name = "김유정";
p1.height = 170;
p1.weight = 77;
Person p2 = new Person("이순신", 188, 88);
p1.showPerson();
p2.showPerson();
}
### 참조자료형(reference data type)
참조 자료형은 개발자가 만드는 자료형이라고 할 수 있다.
c언어는 struct(구조체)를 이용해서 만들지만, 자바는 객체특성을 갖고 있기에 클래스를 활용한다.
public class Student {
int grade;
String subject;
int score;
}
--------------------------------------
public class Subject {
string SubjectName;
int SubjectScore;
}
public class student1 {
int grade
Subject korean;
Subject math
}
student 클래스에서 여러 과목의 점수와 이름을 멤버변수로 쓰기위해서는 계속해서 멤버변수를 추가해야한다.
하지만, 이와달리 Subject 클래스를 생성하여 student1에서 Subject 클래스를 활용하여 멤버변수로 추가한다.
## 정보은닉
public / private
public 과 private 예약어를 '접근 제어자' 라고 부른다.
public은 외부 클래스에서 접근이 가능하다. 하지만, private은 외부 접근이 불가능하다.
public class student {
int studentID;
pirvate String studentName;
int grade;
public String getStudentName() {
return studentName;
}
public void setStudentName(String name){
studentName = name;
}
}
----
public class studentTest {
public static void main(String[] args){
Student st1 = new Student();
//st1.studentName = "이순신"; /* 오류 */
st1.setStudentName("이순신");
}
}
student 클래스에서 studentName을 private으로 하였다. 그리고 studentTest main에서 student 인스턴스를 생성하고 studentName에 이순신 을 입력하였지만, 해당 코드는 오류로 나타난다.
private 이지만 외부코드에서 접근하기 위해서는 get() , set() 메소드를 이용해야 한다.
(값을 얻는 get()메소드를 getter, 값을 지정하는 set()메서드를 setter 라고 한다.)
st1 인스턴스에 st1.setStudentName("이순신") 으로 작성하여 해당 value 값을 넘겨준다.
즉, public 메서드를 통하여 private 변수에 접근해야한다.
그렇다면 변수를 public으로 선언하는 것과 private으로 선언하는 이유는 무엇일까?
public class MyDate {
int year;
int month;
int day;
}
public class MyDateTest {
public static void main(String[] args){
MyDate date = new MyDate();
date.year = 2021;
date.month = 2;
date.day = 31;
/* 2월 달은 28,29 일 까지 이다. */
}
}
public class MyDate{
private int day;
private int month;
private int year;
public setDay(int day) {
if(month == 2) {
if(day <1 || day>28) System.out.println("오류");
else this.day = day;
}
}
}
2월은 28,29 일이다. 하지만 30 ,31 일이 대입될 경우 오류가 발생해야한다.
따라서 이렇게 데이터의 오류가 발생할 경우 해당 변수 값에 값이 대입되지 않도록 하기 위해서 private 예약어를 생성하여 public 메서드로 접근하도록 한다.
이렇게 클래스 내부에서 사용할 변수나 메서드를 private으로 선언해서 외부에서 접근하지 못하도록 하는 객체 지향을 '정보 은닉' 이라고 한다.
연습문제
public class MyDate {
int day;
int month;
int year;
public boolean isValid = true;
public MyDate(int day, int month, int year){
setDay(day);
setMonth(month);
setYear(year);
}
public getDay(){
return day;
}
public void setDay(int day){
switch(month){
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
if(day < 1 || day > 31){
isValid = false;
}
else this.day = day;
break;
case 4: case 6: case 9: case 11:
if(day<1 || day>30) {
isValid = false;
}
else this.day = day;
break;
case 2:
if((year % 4 ==0 || year % 100 !=0) && year % 400 == 0{
if(day<1 || day>29){
isValid = false;
}
else this.day = day;
}
}
}
public getMonth() {
return month;
}
public setMonth(int month){
if(month<1 || month>12){
isValid = false;
} else this.month = month;
}
public getYear() {
return year;
}
public void setYear(int year){
this.year = year;
}
public String isValid() {
if(isValid) return "유효";
else return "유효 ㄴㄴ";
}
}
실행 메인함수
public class MyDateTest() {
public static void main(String[] args){
MyDate date1 = new MyDate(11, 2, 2000);
System.out.println(date1.isValid());
MyDate date2 = new MyDate(30 , 2, 2020);
System.out.println(date2.isValid());
}
}
출처 : DO IT! 자바프로그래밍 (저 : 박은종)
'개인공부 > JAVA' 카테고리의 다른 글
JAVA - Inner Class, Lambda , Stream (0) | 2021.03.21 |
---|---|
JAVA - CLASS (0) | 2021.03.16 |
JAVA - INTERFACE (0) | 2021.03.12 |
JAVA - Abstract (0) | 2021.03.10 |
JAVA - Class 와 Object - 2 (0) | 2021.03.08 |