Ch02. 객체지향입문 01

하파타카·2022년 8월 20일
0

패캠JAVA, Spring과정

목록 보기
5/20

01.객체와 객체지향 프로그래밍

객체

  • 구체적 혹은 추상적인 데이터의 단위
  • 간단히 말해 여러가지 명사를 객체라고 생각하면 쉬움

절차 지향 프로그래밍

  • 시간이나 사건의 흐름에 따르는 프로그래밍 방식
  • 대표적인 예시는 C언어
  • 객체지향과 절차지향은 반대되는 개념이 아님

예) 기상 > 세면 > 버스탑승 > 출근완료

객체 지향 프로그래밍

  • 관계를 이용해 프로그래밍 하는 방식
  • C++ C# Python Javascript 등 다양한 언어가 객체 지향 프로그래밍 방식을 사용함

객체지향 프로그램의 구현

  • 객체 정의
  • 각 객체에 대한 기능 구현
  • 각 객체가 제공하는 기능들간의 소통을 통하여 객체간의 협력을 구현
    (예 - parameter를 넘기거나 받는 과정 등)

02.생활 속에서 객체를 찾아 클래스로 구현하기

클래스를 만든다는 것은 해당 객체를 추상화하여 코딩으로 구현하는 것임.

클래스란?

  • 클래스는 객체의 청사진
  • 객체의 속성은 클래스의 멤버변수(member variable)로 선언한다.
    (참고 - 지역변수는 중괄호{}내에서만 사용되는 변수를 칭함)
  • 클래스의 이름은 대문자로 시작하며, 단어가 바뀔때마다 대문자를, 나머지는 소문자를 사용하는 방식을 사용.
    => camel case
  • 클래스 내의 속성은 추가하거나 삭제하는 등 수정이 가능함
  • 하나의 java파일 내에서 public키워드를 가진 클래스는 하나만 존재할 수 있음

예시

회원 클래스

public class UserInfo {

	String userId;
	String userPassWord;
	String userName;
	String userAddress;
	int phoneNumber;
}

주문 클래스

public class Order {
	
	int orderId;
	String buyerId;
	String sellerId;
	int productId;
	String orderDate;
}

public : 어디에서든 접근할 수 있음을 표시하는 접근제어자
접근 제어자를 생략 시 자동으로 default가 적용됨.
이 부분에 대해서는 추후 강의에 나올때 다시 메모함.


03.함수와 메서드

함수

  • 하나의 기능을 수행하는 일련의 코드
  • 구현된 함수는 호출하여 사용하며, 호출된 함수는 기능이 끝나면 반환됨.
    반환 시 제어권만 반환이 될 수도, 값이 함께 반환될 수도 있음.
  • 함수로 구현된 기능은 여러 위치에서 호출하여 사용할 수 있음

함수 정의하기

  • 이름, 매개변수, 반환 값, 함수 몸체(body)로 구성됨
// 반환값이 있는 함수
int add(int num1, int num2){
	int result;
    result = num1 + num2;
    return result;
}
// 반환값과 매개변수가 없는 경우
void add(){
	// 코드생략
}

예시

public class FunctionTest {
	
	// 매개변수 존재, 반환 값 존재
	public static int addNum(int num1, int num2) {
		int result;
		result = num1 + num2;
		return result;
	}
	// 매개변수 없음, 반환값 존재
	public static int calcSum() {
		
		int sum = 0;
		int i;
		
		for(i = 0; i<=100; i++) {
			sum += i;
		}
		return sum;
	}

	public static void sayHello(String greeting) {
		System.out.println(greeting);
	}
	
	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);
	}
}



지역변수의 메모리할당은 스택(Stack) 방식임.
각 함수가 호출되면 해당 함수에 대한 지역변수가 들어갈 메모리공간이 할당됨.
이때 메인함수에 존재하는 지역변수와 addNum(int num1, int num2)함수, calSum()함수에서 사용되는 지역변수마다 모두 다른 메모리공간을 할당받아 사용함.
함수의 사용이 끝나는 동시에 할당받은 메모리공간은 자동소멸됨.

참고
메서드는 함수의 한 종류임


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

하나의 클래스를 기반으로 여러개의 인스턴스를 생성할 수 있음.
아래의 예시코드에서 studentKim이 인스턴스(참조변수)가 된다.
이 인스턴스(참조변수)를 이용하여 미리 생성한 메서드를 호출할 수 있다.

인스턴스 :
참조변수 : 인스턴스가 저장된 메모리의 주소값을 저장하는 변수

예시

Student클래스

package ch04;

public class Student {

	public int studentID;
	public String studentName;
	public String address;
	
	public void showStudentInfo() {
		System.out.println(studentID + "학번 학생의 이름은 " + studentName + "이고, 주소는 " + address + "입니다.");
	}
	
	// 학생의 이름을 리턴하는 메서드
	public String getStudentName() {
		return studentName;
	}
	
	// 학생의 이름을 지정하는 메서드
	public void setStudentName(String name) {
		studentName = name;
	}
}

StudentTest클래스

package ch04;

public class StudentTest {
	public static void main(String[] args) {
		
		Student studentKim = new Student();	// 클래스 생성
		 
		studentKim.studentID = 123;
		studentKim.setStudentName("KIM");
		studentKim.address = "서울 강남구";
		
		studentKim.showStudentInfo();
		
		Student studentLee = new Student();
		 
		studentLee.studentID = 1234;
		studentLee.setStudentName("LEE");
		studentLee.address = "경기도 성남시";
		
		studentLee.showStudentInfo();
	}
}


=> 생성된 인스턴스를 이용해 메서드를 호출하여 사용할 수 있다.

인스턴스가 생성되는것은 힙(Heap) 메모리 방식.
지역변수의 경우 스택(Stack) 메모리 방식.

참고
각자 개념을 헷갈리지 말 것


05.인스턴스 생성과 힙(Heap) 메모리

인스턴스

  • 클래스란?
    : 객체의 속성을 정의하고, 기능을 구현한 상태
  • new키워드를 이용하여 인스턴스를 생성
  • 클래스로부터 생성된 객체를 인스턴스라고 함
  • 인스턴스마다 각각 다른 멤버변수값을 가짐.
    예를 들어 학생의 클래스에서 생성된 각각의 인스턴스는 각각 다른 이름, 학번, 학년 등의 값을 가진다.
    => 클래스는 하나이지만 각 인스턴스마다 할당된 메모리는 모두 다름
  • 인스턴스가 할당받는 메모리는 힙(Heap) 이라는 동적 메모리로, 필요할 때 사용한 후 해제됨

멤버번수란?
메서드 밖에서 정의된 변수.
반대로 메서드 안에서 정의된 변수는 지역변수가 된다.

힙(Heap) 메모리

  • 자바에서 Gabage Collector 가 주기적으로 사용하지 않는 메모리를 수거함
  • 생성된 인스턴스는 동적 메모리(heap memory) 에 할당됨
  • 하나의 클래스로 부터 여러개의 인스턴스가 생성되고 각각 다른 메모리 주소를 가지게 됨

예제

예제코드는 위의 04와 동일.
메인함수에 아래의 코드를 추가하여 테스트.

System.out.println(studentKim);
System.out.println(studentLee);


각 인스턴스의 메모리주소값이 출력됨.
즉, 할당된 메모리의 위치가 다름을 확인할 수 있다.(힙 메모리에 할당됨)

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


06.생성자

생성자란?

  • 생성자호출 시 힙 메모리에 인스턴스가 생성됨.

  • 생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드로, 일반함수처럼 기능을 호출하는것이 아님

  • 생성자는 반환값이 없으며 클래스의 이름과 동일함

  • 앞선 예제에서 사용한 new Student();가 생성자를 호출하는 부분.

  • 생성자를 직접

기본 생성자

  • 클래스에는 반드시 하나 이상의 생성자가 존재함
  • 클래스에 생성자를 직접 구현하지 않았을 경우 컴파일러가 기본적으로 생성자를 만들어 줌
    pubilc Student(){}
  • 매개변수와 구현부가 없음

예제

Student클래스

package ch06;

public class Student {
	
	public int studentNumber;
	public String studentName;
	public int grade;
	
	public Student() {	}
	
	public Student(int studentNumber, String studentName, int grade) {
		this.studentNumber = studentNumber;
		this.studentName = studentName;
		this.grade = grade;
	}
	

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

StudentTest클래스

package ch06;

public class StudentTest {
	public static void main(String[] args) {
		
		Student studentLee = new Student();
		System.out.println(studentLee.showStudentInfo());
		
		Student studentKim = new Student(123, "Kim", 2);
		System.out.println(studentKim.showStudentInfo());
	}
}


자동으로 초기화가 이루어지는 멤버변수의 경우 예제의 첫번째 출력행처럼 에러없이 null, 0 등 초기값이 출력되지만
직접 초기화과정을 거쳐줘야하는 지역변수의 경우 에러가 발생한다.

소프트웨어적으로 객체 이해하기
서비스를 사용하는 모듈은 클라이언트 모듈, 서비스를 제공하는 모듈은 서비스 모듈


07.생성자 오버로딩

오버로딩은 메서드를 재정의 하는 것.
생성자 오버로딩은 기본적으로 생성된 기본생성자를 오버로딩하여 사용자가 원하는 대로 기본생성자를 수정할 수 있도록 하는 것.


08.복습-객체 구현하기

1번

키가 180 이고 몸무게가 78 킬로인 남성이 있습니다. 이름은 Tomas 이고 나이는 37세입니다.

내가 푼 답

Human클래스

package ch08;

public class Human {
	
	public String name;
	public int age;
	public int height;
	public int weight;
	
	public Human(String name, int age, int height, int weight) {
		this.name = name;
		this.age = age;
		this.height = height;
		this.weight = weight;
	}
	
	public String humanPrint() {
		return(name + "씨의 나이는 " + age + "세, 키는 " + height + ", 몸무게는 " + weight + "kg입니다.");
	}
}

HumanTest클래스

package ch08;

public class HumanTest {
	
	public static void main(String[] args) {
		
		Human human01 = new Human("Tomas", 37, 180, 78);
		System.out.println(human01.humanPrint());
	}
}

2번

음식점에 배달 주문이 들어왔습니다.

주문 접수 번호 : 202011020003
주문 핸드폰 번호 : 01023450001
주문 집 주소 : 서울시 강남구 역삼동 111-333
주문 날짜 : 20201102
주문 시간 : 130258
주문 가격 : 35000
메뉴 번호 : 0003

내가 푼 답

Order 클래스

package ch08;

public class Order {
	
	public String orderNum;
	public String phone;
	public String address;
	public int menuNum;
	public String orderDate;
	public String orderTime;
	public int price;

	
public Order(String orderNum, String phone, String address, int menuNum, String orderDate, String orderTime,
			int price) {
		super();
		this.orderNum = orderNum;
		this.phone = phone;
		this.address = address;
		this.menuNum = menuNum;
		this.orderDate = orderDate;
		this.orderTime = orderTime;
		this.price = price;
	}

	public String showOrderInfo() {
		return("주문번호: " + orderNum + "\n전화번호: " + phone + "\n주소: " + address + "\n메뉴번호: " + menuNum + "\n주문날짜:" + orderDate + "\n주문시간: " + orderTime + "\n총 금액: " + price);
	}
}

OrderTest클래스

package ch08;

public class OrderTest {
	public static void main(String[] args) {
		
		Order order01 = new Order("202011020003", "010-1111-2222", "서울시 강남구 역삼동 111-333", 0003, "13시02분58초", "20201102", 35000);
		System.out.println(order01.showOrderInfo());
	}
}


=> 질문!
2번문제에서 orderNum필드를 int나 long으로 생성 후 동일한 매개변수로 인스턴스를 생성했을 때 에러가 발생.
String으로 변경하니 에러가 발생하지 않았음.
왜???

참고
생성자를 만들 때 아래의 사진처럼 이클립스의 기능을 이용해 만들 수 있음.
오타를 방지할 수 있으니 알아두기.

우클릭 > source

사용할 필드를 선택하여 generate



수강후기

아무래도 강의로 한 번 쭉 JAVA와 Spring에 대한 개념을 훑은 후 부족한 부분을 모아 한번 더 개념정립을 해야 할 것 같다.
앞의 과정까지는 괜찮았지만 JAVA의 객체관련 개념이 등장하니 자꾸 헷갈리고 모르겠다.

profile
천 리 길도 가나다라부터

0개의 댓글