[Java] 자바 프로그래밍 - 06 객체지향프로그래밍 - 01

Dev_Honey·2022년 12월 8일
0

JAVA

목록 보기
6/8
post-thumbnail

클래스와 객체 - 01

1. 객체(Object), 클래스(class)

  • 객체(Object)?
    "의사나 행위가 미치는 대상" - dic
    구체적, 추상적 데이터 단위
  • 객체지향프로그래밍(Object Oriented Programming,OOP)
    객체를 기반으로 하는 프로그래밍
    cf. 절차지향 프로그래밍(Procedural Programming,(ex)C언어)

객체 지향 이해
학교 가는 과정을 예시로

  • 일어난다 -> 씻는다 -> 밥을 먹는다 -> 버스를 탄다 -> 요금을 지불 -> 학교에 도착( )
    각 요소를 객체로(객체지향)
    학생<----------->밥(학생(객체)은 밥(객체)를 먹는다(행위,기능))
    학생<----------->학교(학생(객체)은 학교(객체)에 간다)
    학생<----------->버스(학생(객체)은 버스(객체)를 탄다)

클래스(class)
객체에 대한 속성과 기능을 코드로 구현 한 것
"클래스를 정의 한다" 라고 함
객체에 대한 청사진(blueprint)

객체의 속성
객체의 특성,속성,멤버 변수
property, attribute, member variable

객체의 기능
객체가 하는 기능들을 Method로 구현
method,member function

클래스 정의 하기
class는 대부분 대문자로 시작
하나의 java파일에 하나의 클래스를 두는 것이 원칙이나, 여러 개의 클래스가 같이 있는 경우 public 클래스는 단 하나이며, public 클래스와 자바 파일의 이름은 동일해야 함
자바의 모든 코드는 class 내부에 존재

(접근 제어자) class 클래스 이름{
//접근 제어자 안쓰는 경우도 있는데 보통 public 씀! class이름은 대문자로 시작!
	member variable
    method;
}

If have students class !!
Attribute : 학번,이름,학년,사는 곳 등등...
function : 수강신청,수업듣기,시험 보기 등등...

패키지(package)??
소스의 묶음이라고 생각하면 됩니다!


2. 메서드(Method)

함수의 일종이다.
객체의 기능을 제공하기 위해 클래스 냉부에 구현되는 함수

함수(function)?
하나의 기능을 수행하는 일련의 코드
중복되는 기능은 함수로 구현하여 함수를 호출하여 사용
예를 들어, 수를 더하는 함수가 있다고 하자
parameter로 숫자 2개를 입력받아 더하는 코드
가장 좋은 성적 2개를 더하는 코드
두 거리를 더하는 코드

package object_lecture;
public class MethodEx01 {
	public static void main(String[] args) {
		int num1 = 10;
		int num2 = 30;
		int sum = addNum(num1, num2);
		System.out.println("sumValue:" + sum);

	}
	public static int addNum(int n1, int n2) {
		int result = n1 + n2;
		return result;
	}
}

스택메모리(Stack Memory)?

말그대로 stack 알고리즘을 말하는데, Stack은 후입선출!! 즉, 나중에 들어간 것이 먼저 나오는 구조!!

함수를 왜 쓰나요?!?!

  • 코드를 효율적으로 구현하기 위해서 입니다. 즉, 함수로 만들어놓으면 필요한 기능만 호출해서 사용하면 되기때문에 코드의 효율이 좋아지고, 가독성도 좋아집니다.
  • 기능이 class로 모듈화가 되어 있기때문에, 오류나 이런부분의 해결이 용이합니다. 즉, 유지 및 보수의 차원에서 이점이 있습니다.
  • 함수의 이름은 기능을 설명하는 역할을 합니다. 즉, 함수는 하나의 기능을 함수의 이름에 맞게 구현하는게 가장 적절합니다.

3. Class & Instance(클래스와 인스턴스)

1. 클래스 생성하기

클래스를 사용하기 위해서는 클래스를 생성해야합니다.
new 예약어를 이용하여 클래스를 생성합니다.
클래스형 변수이름 = new 생성자
ex)
Student studentA = new Student()

package object_lecture;

public class Student {

	int studentID;
	String studentName;
	int grade;
	String address;
    
	public void showStudentInfor() {
		System.out.println(studentID + " " + studentName + "," + address);
	}
	public String getStudentName() {
		return studentName;
	}
	public void setStudentName(String name) {
		studentName = name;
	}
	public static void main(String[] args) {
		// 4byte,integer
		int i = 10;
		// 객체,참조형 데이터 타입, 참조 변수
		Student studentLee = new Student();
		// ctrl + space == 도움말
		studentLee.studentName = "이영애";
		studentLee.studentID = 100;
		studentLee.address = "서울시 영등포구 여의도동";
        
		Student studentG = new Student();
		studentG.studentName = "지드래곤";
		studentG.studentID = 101;
		studentG.address = "서울시 마포구 망원동";
        
		studentLee.showStudentInfor();
		studentG.showStudentInfor();
	}
}

2. 인스턴스 여러 개 생성하기

oop의 관점에서 객체가 메모리에 할당되어 실제 사용될 때 '인스턴스'라고 부른다.


public static void main(String[] args) {
		// 4byte,integer
		int i = 10;
		// 객체,참조형 데이터 타입, 참조 변수
		Student studentLee = new Student();
		// ctrl + space == 도움말
		studentLee.studentName = "이영애";
		studentLee.studentID = 100;
		studentLee.address = "서울시 영등포구 여의도동";
        
		Student studentG = new Student();
		studentG.studentName = "지드래곤";
		studentG.studentID = 101;
		studentG.address = "서울시 마포구 망원동";
        
		studentLee.showStudentInfor();
		studentG.showStudentInfor();
	}

위의 코드와 같이 인스턴스를 2개 생성하였다.

인스턴스와 힙(heap) 메모리

하나의 클래스 코드로부터 여러 개의 인스턴스를 생성
인스턴스는 힙(Heap) 메모리에 생성됨
각각의 인스턴스는 다른 메모리에 다른 값을 가짐

  • Stack 메모리는 함수가 호출되면 지역변수가 쌓임 -> 함수가 돌면 사라짐, Heap메모리는 new통해서 공간이 생기는데, 사용하고나면, Java의 경우 Garbage Collector(GC)에 들어간다.(Heap 메모리는 Dynamic memory(동적메모리)이다.), 객체의 Attribute들이 heap 메모리에 들어간다.

클래스,인스턴스,참조변수, 참조 값

용어설명
객체객체 지향 프로그램의 대상, 생성된 인스턴스
클래스객체를 프로그래밍하기 위해 코드로 만든 상태
인스턴스클래스가 메모리에 생성된 상태
멤버 변수클래스의 속성, 특성
메서드멤버 변수를 이용하여 클래스의 기능을 구현
참조 변수메모리에 생성된 인스턴스를 가리키는 변수
참조 값생성된 인스턴스의 메모리 주소 값

		System.out.println(studentLee);
		// studentLee를 참조변수라고 하고,
		// 출력된 object_lecture.Student@15db9742 이거를 reference value, 참조 값이라고 한다.

4. 생성자(constructor)

생성자 기본 문법

<modifiers><class_name>([<argument_list>])
{
[<statements>]
}

인스턴스 생성 시 new 키워드와 함께 사용했던 생성자
생성자는 클래스 이름과 같아야한다. == default 생성자
Java compiler가 default 생성자가 없을 시 넣어준다. Precompile step에서!

public Student(){}
//이 코드가 바로 default 생성자 코드
//특징은 매개변수가 없고, 구현 코드가 없다.
//default 생성자는 생성자 코드가 하나도 없을 때 생성이된다.
  • 생성자의 목적은 최초 객체를 생성할 때, 내가 그 객체로 하고 싶은 것들을 생성자로 만든다.
  • 즉, 객체를 생성할 때, 기본 이름을 주고 싶다하면 생성자를 이용
    ex)
  • 매개변수가 있는 생성자!
int studentID;
String studentName;
int grade;
String address;

public Student(){}

public Student(int id, String name){
	studentID = id;
    studentName = name;
}
생성자를 안써주면 알아서 default생성자가 생기고, 생성자는 default생성자를 직접 명시해줘서 사용할 수 있다. 그리고 매개변수를 필요로하는 생성자도 위와같이 같이 사용 가능! 생성자는 반환 값을 가지지 않는다. 위와 같이 매개 변수를 써서 생성자를 만들어줘서 사용하는 것을 생성자 오버로딩(overloading)이라고 한다.

keyword : overloading, overriding

정리
< 생성자(constructor) >

  • 생성자는 인스턴스를 초기화 할 때의 명령어 집합
  • 생성자의 이름은 그 클래스의 이름과 같음
  • 생성자는 메소드가 아님. 상속되지 않으며, 리턴 값은 없음
    <디폴트 생성자(default constructor)>
  • 하나의 클래스에는 반드시 적어도 하나 이상의 Constructor가 존재
  • 프로그래머가 Constructor를 기술하지 않으면, Default Constructor가 자동으로 생김(컴파일러가 코드에 넣어 줌)
  • Default Constructor는 매개 변수가 없음
  • Default Constructor는 구현부가 없음
    만약, 클래스에 매개변수가 있는 생성자를 추가하면 디폴트 생성자는 제공되지 않음!
    <생성자 오버로드(constructor overload)>
  • 필요에 의해 생성자 추가 하는 경우 여러 개의 생성자가 하나의 클래스에 있음(overload)
//생성자 오버로드
package object_lecture;

public class Student {
int studentID;
String studentName;
int grade;
String address;
float studentHeight;
float studentWeight;

// 디폴트 생성자
public Student(){}

// 생성자 오버로드(id,name을 parameter로 받는 생성자)
public Student(int id, String name){
	studentID = id;
    studentName = name;
    }
// 생성자 오버로드(name,height,weight를 parameter로 받는 생성자)
public Student(String name, float height, float weight){
	studentName = name;
    studentHeight = height
    studentWeight = weight
    }
}

6. 참조자료형(reference data type)

  • 변수의 자료형
    • 기본 자료형 : int,long,float,double 등
    • 참조 자료형 : String, Date, Student 등 === 클래스 형으로 선언하는 자료형

참조 자료형의 예시

  • 학생의 속성 중 수업에 대한 부분
  • 수업에 대한 각 속성을 학생 클래스에 정의 하지 않고 수업이라는 클래스로 분리
  • 과목은 참조 자료형으로 선언



  • 데이터 무결성
    데이터 무결성은 데이터의 정확성, 일관성, 유효성이 유지되는 것. 여기서 정확성이란 중복이나 누락이 없는 상태를 뜻하고, 일관성은 원인과 결과의 의미가 연속적으로 보장되어 변하지 않는 상태
    만약 데이터베이스에서 데이터 무결성 설계를 하지 않는다면 테이블에 중복된 데이터 존재, 부모와 자식 데이터 간의 논리적 관계 깨짐, 잦은 에러와 재개발 비용 발생 등과 같은 문제가 발생

Getter와 Setter

	public int getScore() { //접근 제한자 , 반환 자료형, 메소드 이름(get+name) , return 필드값
		return score;
	} // getter
	public void setScore(int score) { //접근제한자, 리턴 타입(void), 메소드 이름(set+name),parameter type:field type
		this.score = score;
	} // setter
  • Setter Method
    외부에서 메소드를 통해 데이터에 접근하도록 유도
    private로 선언된 필드의 값을 수정하고자 할 때 사용!
    기작은 객체는 입력 값을 setter 메소드의 parameter값으로 넘기고, 유효하면 값을 저장하게 된다.즉, 데이터를 변경하는 역할
  • Getter Method
    외부에서 객체의 데이터를 읽을 때 사용하는 메소드
    주로, 데이터를 읽어오는 역할을 수행한다. 외부에서 객체의 데이터를 읽을 때 안전하게 값을 유지할 수 있도록 해주는 역할이다.
  • 일반적으로 Getter와 Setter는 set로 많이쓰나, 필요할 때는 필요한 메소드를 생성할 수 있다.

정보은닉(Information hiding)

  • private 접근 제어자
    • 클래스의 외부에서 클래스 내부의 멤버 변수나 메서드에 접근(access)하지 못하게 하는 경우 사용
    • 멤버 변수나 메서드를 외부에서 사용하지 못하도록 하여 오류를 줄일 수 있음
    • 변수에 대해서는 필요한 경우 get(),set() 메서드를 제공
package hiding_lecture;

class BirthDay {

	private int day;
	private int month;
	private int year;

	// private,public 접근 제어자인데 private는 클래스 안에서만 접근 가능함!,public은 외부 클래스에서 다 접근 가능!
	// 만약 접근 제어자를 안쓰게 되면 ex) int year; 이렇게 사용하면 같은 package내에서만 접근 가능!
	// 그래서 만약 private 접근제어자인데 값을 세팅해주고 싶으면?! getter,setter로 접근 시킨다!
	// 데이터가 public일 경우 , 무결성이 무너질 수 있다.
	public int getDay() {
		return day;
	}

	// 그래서 변수를 감싸두고 필요한 것은 setter,getter를 통해서 validate 시켜서 수정할 수 있게 한다.
	public void setDay(int day) {
		if (month == 2) {
			if (day < 1 || day > 28) {
				System.out.println("날짜 오류입니다.");
			} else {
				this.day = day;
			}
		}

	}

	public int getMonth() {
		return month;
	}

	public void setMonth(int month) {

		this.month = month;
	}

	public int getYear() {
		return year;
	}

	public void setYear(int year) {
		this.year = year;
	}
}

public class BirthDayTest {

	public static void main(String[] args) {

		BirthDay day = new BirthDay();
		day.setDay(30);
		day.setMonth(2);
		day.setYear(2022);

	}
}

출처 및 참조

profile
자습서 같은 공부 블로그 만들기!

0개의 댓글