Chapter 05. 객체지향 클래스(1)

박철민·2021년 8월 6일
0
post-thumbnail

수강 날짜 21-08-06

강의명 : 01 객제지향 프로그래밍과 클래스-1
강의명 : 02 객제지향 프로그래밍과 클래스-2
강의명 : 03 함수와 메서드-1
강의명 : 04 함수와 메서드-2
강의명 : 05 인스턴스, 힙 메모리
강의명 : 06 코딩해 보세요(1)

객제지향 프로그래밍과 클래스-1

객체란 무엇인가?
객체

  • 의사나 행위가 미치는 대상
  • 구체적, 추상적 데이터의 단위

객체 지향 프로그래밍 이란?

  • 객체를 기반으로 하는 프로그래밍
  • 객체를 정의 하고, 객체의 기능을 구현하며, 객체간의 협력을 구현

cf.절차 지향 프로그래밍

  • 시간이나 사건의 흐름에 따른 구현

이 둘의 차이를 예를 들어 표현하면 다음과 같다.

학교 가는 과정을 구현

절차 지향 프로그래밍
1. 일어난다
2. 씻는다.
3. 밥을 먹는다.
4. 버스를 탄다.
5. 요금을 지불한다
6. 학교에 도착한다.

객체 지향 프로그래밍

객체 : 학생, 버스, 밥, 학교
이 들 간의 관계를 구현

클래스

객체를 코드를 구현한 것
객체 지향 프로그래밍의 가장 기본 요소
객체의 청사진

코드가 객체인 것이 아니다.
객체의 코드가 클래스인것!!!!!

코드를 객체화 하기 위해서는 메모리에 올라가 인스턴스화해야 한다.


멤버변수, 메서드
멤버 변수

  • 객체가 가지는 속성을 변수로 표현
  • 클래스의 멤버변수
  • member variable, property, attribyte

메서드

  • 객체의 기능을 구현
  • method, member function

객체 내의 포함된 함수인 것을 기억하자!


객제지향 프로그래밍과 클래스-2

실습
학생이 있습니다.
학생은 학번, 이름, 주소 값을 가집니다.
학생의 정보를 보여줍니다.
학생에 대한 클래스를 구현해보세요

public class Student {
	
	int studentID;
	String studentName;
	String address;
	
	public void showStudentInfo() {
		System.out.println(studentName + ", " + address);
	}
}
//클래스의 접근 제한자의 public은 오직 클래스명과 동일한 이름의 클래스만이 가능하다.

//String의 앞 대문자인 것을 보고 이것이 클래스라는 것을 알 수 있다.

이렇게 구현한 코드를 사용하기 위하여 외부에서 생성자를 이용하여 객체를 선언하여 메서드를 사용해보자

public class StudentTest {
	public static void main(String[] args) {
		Student stu = new Student();
		//생성자를 통해 메모리에 클래스가 인스턴스화된다.			stu.studentID = 100;
		stu.studentName = "홍길동";
		stu.address = "서울 홍대";
		stu.showStudentInfo();
	}
}

클래스 사용하기
클래스 생성하기

  • new 키워드를 사용하여 생성자로 생성

클래스의 속성, 메서드 참조하기

  • 생성에 사용한 변수(참조변수)로 클래스의 속성, 메서드 참조

public클래스
자바 파일 하나에 여러 개의 클래스가 존재 가능
단,public클래스는 하나이고 public클래스와 자바 파일 이름은 동일해야 함


함수와 메서드 -1

함수란 무엇인가요?
함수

  • 하나의 기능을 수행하는 일련의 콛,
  • 함수는 호출하여 사용하고 기능이 수행된 후 값을 반환 할 수 있음
  • 함수로 구현된 기능은 여러 곳에서 호출되어 사용될 수 있음

함수 정의 하기
함수는 이름, 매개변수, 반환 값, 함수 몸체로 구성 됨

예제

public class FunctionTest {
	
	public static int addNum(int num1, int num2) {
		return num1 + num2;
	}
	
	public static void sayHello(String greeting) {
		System.out.println(greeting);
	}
	
	public static int calcSum() {
		
		int sum = 0;
		int i;
		
		for(i = 0; i<=100; i++) {
			sum+=i;
		}
		
		return sum;
	}
	
	public static void main(String[] args) {
		
		int n1 = 10;
		int n2 = 20;
		
		int total = addNum(n1, n2);
		
		sayHello("안녕하세요");
		int num = calcSum();
		
		System.out.println(total);
		System.out.println(num);
	}
}


함수와 메서드 -2

메서드

  • 객체의 기능을 구현하기 위해 클래스 내부에 구현되는 함수
  • 메서드를 구현함으로써 객체의 기능이 구현 됨
  • 메서드의 이름은 사용하는 쪽(클라이언트 코드)에 맞게 명명하는 것이 좋음

메서드와 변수는 카멜 케이스로 선언하는 것이 암묵적인 규칙이다.

함수에 사용하는 메모리는 스택 메모리이다.
이러한 메모리 관련 내용은 기억하는 것이 좋다.

인스턴스, 힙 메모리

인스턴스
클래스로 부터 생선된 객체
힙 메모리에 멤버 변수의 크기에 따라 메모리가 생성(크기가 그것에 맞춰서 생성된다)

클래스를 기반으로 new 키워드를 이용하여 여러 개의 인스턴스를 생성한다.

스택에 인스턴스의 주소값을 저장하고 그 주소값을 참조하여 힙에 저장된 인스턴스를 참조한다. 그래서 힙에 저장된 변수들을 레퍼런스(참조)변수라고 한다.

예제

public class StudentTest {
	public static void main(String[] args) {
		Student stu = new Student();
		stu.studentID = 100;
		stu.studentName = "홍길동";
		stu.address = "서울";
		
		stu.showStudentInfo();
		
		Student studentKim = new Student();
		studentKim.studentName = "김유신";
		studentKim.address= "경주";
		
		studentKim.showStudentInfo();
		//.은 호출 연산자
	}
}

클래스의 멤버 변수는 new 연산자를 통해서 동적 메모리(heap)에 인스턴스화 될때 메모리를 할당 받는다.
stack에 포인터 사이즈 만큼 잡힌다. 그경우 클래스의 멤버 변수만큼 메모리를 heap에 할당 받는다.

그렇다면 클래스 멤버 변수가 레퍼런스 변수인 경우는 어떻게 되는가?
-> heap에서도 메모리를 가르키는 변수가 생기고 그것을 참조하여 heap에 참조 변수를 호출하여 사용한다.

Garbage Collector
java의 특수한 쓰레드로 더이상 사용하지 않는 참조 변수들을 수거하여 메모리를 풀어준다!
ex) 참조 변수가 다른 값을 참조하게 될 경우!

	A a = new A();
	B b = new B();

	b = a;

용어 정리

코딩해보세요(1)

다음 객체에 대한 설명에 맞는 클래스를 만들고 값을 출력해 보세요
나이가 40살, 이름이 James라는 남자가 있습니다. 이 남자는 결혼을 했고, 자식이 셋 있습니다.
<출력 결과>
나이 : 40
이름 : James
결혼여부 : true
자녀 수 : 3


Person 클래스

public class Person {
	int age;
	String name;
	boolean isMarried;
	int numberOfChildren;
}

PersonTest 클래스

public class PersonTest {
	
	public static void main(String[] args) {
		
		Person person = new Person();
		person.age = 40;
		person.name = "James";
		person.isMarried = true;
		person.numberOfChildren = 3;

		System.out.println("나이 : " + person.age);
		System.out.println("이름 : " + person.name);
		System.out.println("결혼 여부 : " + person.isMarried);
		System.out.println("자녀 수 : " + person.numberOfChildren);
	}
}

실습 문제

아래 내용을 클래스로 구현하세요
쇼핑몰에 주문이 들어왔습니다. 주문 내용은 다음과 같습니다.

주문 번호: 201907210001
주문자 아이디 : abc123
주문 날짜 : 2019년 7월 21일
주문자 이름 : 홍길순
주문 상품 번호 : PD0345-12
배송 주소 : 서울시 영등포구 여의도동 20번지

풀이
Order 클래스

public class Order {
	String orderId;
	String customerId;
	String orderDate;
	String customerName;
	String productId;
	String address;
	
}

OrderTest클래스

public class OrderTest {
	public static void main(String[] args) {
		Order order = new Order();
		
		order.orderId = "201907210001";
		order.customerId = "abc123";
		order.orderDate = "2019년 7월 21일";
		order.customerName = "홍길순";
		order.productId = "PD0345-12";
		order.address = "서울시 영등포구 여의도동 20번지";

		System.out.println("주문 번호: " + order.orderId);
		System.out.println("주문자 아이디 : " +order.customerId );
		System.out.println("주문 날짜 : "  +order.orderDate );
		System.out.println("주문자 이름 : " +order.customerName );
		System.out.println("주문 상품 번호 : " +order.productId );
		System.out.println("배송 주소 : " +order.address );
		
	}
}
profile
취준좀비 컴공

0개의 댓글

관련 채용 정보