[JAVA]객체 지향 입문 - 1

WOOK JONG KIM·2022년 8월 24일
0

패캠_java&Spring

목록 보기
2/103
post-thumbnail

🤔 객체란?

물리적으로 존재하거나 추상적으로 생각할 수 있는 것 중에서 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것

소프트웨어 세계에 구현할 대상

ex: ( 학생, 회원, 생산, 주문, 배송 )


객체 지향 프로그래밍

  1. 객체를 정의
  1. 각 객체의 속성을 멤버 변수로 역할을 메서드로 구현
  1. 각 객체간의 협력을 구현

절차 지향적 프로그래밍은 시간적 흐름에 따른 프로그래밍

클래스

유사한 특성의 객체들의 속성을 묶어 놓은 집합체

객체의 속성은 클래스의 멤버 변수(member variable)로 선언

  • 멤버 변수 : 메서드 밖에서 선언된 변수
  • 지역 변수(local) : 메서드 안에 선언된 변수
public class Student {

	int studentNumber;
	String studentName;
	int majorCode;
	String majorName;
	int grade;
}

함수

하나의 기능을 수행하는 일련의 코드

함수로 구현된 하나의 기능은 여러 곳에서 동일한 방식으로 호출되어 사용될 수 있음

스택

함수가 호출될 때 지역 변수들이 사용하는 메모리

메서드 (method)

객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수

메서드를 구현함으로써 객체의 기능이 구현 됨

객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다


인스턴스

객체를 소프트웨어에 실체화한 것

객체가 메모리에 할당되어 실제 사용될 때 인스턴스라 부름

new 키워드를 사용하여 인스턴스 생성

생성된 인스턴스가 할당 되는 곳

하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨

Heap에는 인스턴스 생성 시 사용된 클래스의 멤버변수들이 들어있겠지?


생성자(constructor)

new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드

객체가 생성될 때 변수나 상수를 초기화 하거나 다른 초기화 기능을 수행하는 메서드를 호출 함

클래스에 생성자가 하나도 없는 경우 컴파일러가 생성자 코드를 넣어 줌(기본 생성자)

public Class_name(){}
public class Student {

	public int studentNumber;
	public String studentName;
	public int grade;
	
	public Student(int studentNumber, String studentName, int grade) {
		this.studentNumber = studentNumber;
		this.studentName = studentName;
		this.grade = grade;
	}
	
	public String showStudentInfo() {
		return studentName + "학생의 학번은 " + studentNumber + "이고, " + grade + "학년 입니다.";
	}
}

오버로딩(overloading)

같은 이름을 사용해서 메소드를 정의하는 것

메소드의 이름이 같고, 매개변수의 개수나 타입이 달라야 한다

리턴 값만 다른 것은 오버로딩 불가


참조 자료형

클래스형으로 변수를 선언!!

// subject.java

package ch09;

public class Subject {
	String subjectName;
	int score;
	int subjectID;
}
// Student.java
package ch09;

public class Student {
	
	int studentID;
	String studentName;
	
	Subject korea;
	Subject math;
	
	public Student(int id, String name) {
		studentID = id;
		studentName = name;
		
		korea = new Subject();
		math = new Subject();
	}
	
	
	public void setKoreaSubject(String name, int score) {
		korea.subjectName = name;
		korea.score = score;
	}
	
	public void setMathSubject(String name, int score) {
		math.subjectName = name;
		math.score = score;
	}
	
	public void showStudentSocre() {
		int total = korea.score + math.score;
		System.out.println(studentName +  " 학생의 총점은 " + total + "점 입니다." );
		
	}
}

접근 제어자(Access Modifier)

클래스 외부에서 클래스의 멤버 변수, 메서드, 생성자를 사용할 수 있는지 여부를 지정하는 키워드

  • private : 같은 클래스 내부에서만 접근 가능
    ( 외부 클래스, 상속 관계의 클래스에서도 접근 불가)
  • 아무것도 없음 (default) : 같은 패키지 내부에서만 접근 가능
    ( 상속 관계라도 패키지가 다르면 접근 불가)
  • protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음
  • public : 클래스의 외부 어디서나 접근 할 수 있음

get(), set()

  • private 으로 선언된 멤버 변수 (필드)에 대해 접근, 수정할 수 있는 메서드를 public으로 제공
  • get() 메서드만 제공 되는 경우 read-only 필드
  • 이클립스에서 자동으로 생성됨

SET, GET 메소드를 사용하는 이유는 외부로부터 변수값에 직접적으로 접근하는것을 막기 위해서다.

직접 접근하게 되어 값이 변하게 된다면 데이터 무결성이 깨질 수 있다

정보은닉

클래스 내부에서 사용할 변수나 메서드를 private로 선언해서 외부에서 접근하지 못하도록 하는 것

캡슐화(encapsulation)

  • 정보은닉 활용

  • 꼭 필요한 정보와 기능만 외부에 오픈함

  • 대부분의 멤버 변수와 메서드를 감추고 외부에 통합된 인터페이스만은 제공하여 일관된 기능을 구현 하게 함

package ch11;

public class MakeReport {
	StringBuffer buffer = new StringBuffer();
	
	private String line = "===========================================\n";
	private String title = "  이름\t   주소 \t\t  전화번호  \n";

	private void makeHeader()
	{
		buffer.append(line);
		buffer.append(title);
		buffer.append(line);
	}
	
	private void generateBody()
	{
		buffer.append("James \t");
		buffer.append("Seoul Korea \t");
		buffer.append("010-2222-3333\n");
		
		buffer.append("Tomas \t");
		buffer.append("NewYork US \t");
		buffer.append("010-7777-0987\n");
	}
	
	private void makeFooter()
	{
		
		buffer.append(line);
	}
	
	public String getReport()
	{
		makeHeader();
		generateBody();
		makeFooter();
		return buffer.toString();
	}	
}

getReport 메서드 자세히 보고 왜 이렇게 구현했을지도 생각하기!

public class TestReport {
	
	public static void main(String[] args) {
		MakeReport report = new MakeReport();
		String builder = report.getReport();
		
		System.out.println(builder);
	}
}
profile
Journey for Backend Developer

0개의 댓글