C언어
예) 기상 > 세면 > 버스탑승 > 출근완료
C++
C#
Python
Javascript
등 다양한 언어가 객체 지향 프로그래밍 방식을 사용함클래스를 만든다는 것은 해당 객체를 추상화하여 코딩으로 구현하는 것임.
멤버변수(member variable)
로 선언한다.camel case
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
가 적용됨.
이 부분에 대해서는 추후 강의에 나올때 다시 메모함.
// 반환값이 있는 함수
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()
함수에서 사용되는 지역변수마다 모두 다른 메모리공간을 할당받아 사용함.
함수의 사용이 끝나는 동시에 할당받은 메모리공간은 자동소멸됨.
참고
메서드는 함수의 한 종류임
하나의 클래스를 기반으로 여러개의 인스턴스를 생성할 수 있음.
아래의 예시코드에서 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) 메모리
방식.
참고
각자 개념을 헷갈리지 말 것
new
키워드를 이용하여 인스턴스를 생성힙(Heap)
이라는 동적 메모리
로, 필요할 때 사용한 후 해제됨멤버번수란?
메서드 밖에서 정의된 변수.
반대로 메서드 안에서 정의된 변수는 지역변수
가 된다.
예제코드는 위의 04와 동일.
메인함수에 아래의 코드를 추가하여 테스트.
System.out.println(studentKim);
System.out.println(studentLee);
각 인스턴스의 메모리주소값이 출력됨.
즉, 할당된 메모리의 위치가 다름을 확인할 수 있다.(힙 메모리에 할당됨)
용어 정리
객체
: 객체 지향 프로그램의 대상, 생성된 인스턴스
클래스
: 객체를 프로그래밍 하기위해 코드로 정의해 놓은 상태
인스턴스
: new 키워드를 사용하여 클래스를 메모리에 생성한 상태
멤버 변수
: 클래스의 속성, 특성
메서드
: 멤버 변수를 이용하여 클래스의 기능을 구현한 함수
참조 변수
: 메모리에 생성된 인스턴스를 가리키는 변수
참조 값
: 생성된 인스턴스의 메모리 주소 값
생성자호출 시 힙 메모리에 인스턴스가 생성됨.
생성자는 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드로, 일반함수처럼 기능을 호출하는것이 아님
생성자는 반환값이 없으며 클래스의 이름과 동일함
앞선 예제에서 사용한 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 등 초기값이 출력되지만
직접 초기화과정을 거쳐줘야하는 지역변수의 경우 에러가 발생한다.
소프트웨어적으로 객체 이해하기
서비스를 사용하는 모듈은 클라이언트 모듈, 서비스를 제공하는 모듈은 서비스 모듈
오버로딩은 메서드를 재정의 하는 것.
생성자 오버로딩은 기본적으로 생성된 기본생성자를 오버로딩하여 사용자가 원하는 대로 기본생성자를 수정할 수 있도록 하는 것.
키가 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());
}
}
음식점에 배달 주문이 들어왔습니다.
주문 접수 번호 : 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의 객체관련 개념이 등장하니 자꾸 헷갈리고 모르겠다.