듣고 있는 강의 김영한의 실전 자바 - 기본편
Section#2 클래스와 데이터
클래스 Class
클래스가 필요한 이유
아래와 같이 학생 3명의 이름, 나이, 성적 정보를 출력하는 프로그램을 만든 상황이 있다
한 명의 정보가 name, age, grade 3개의 배열에 나누어져 있기 때문에
특정 학생의 데이터를 변경할 때 실수할 가능성이 매우 높고, 사람이 관리하기에 좋은 코드가 아니다
package class1;
public class ClassStart1 {
public static void main(String[] args) {
/* 학생 이름, 나이, 성적 출력하는 문제 */
String[] studentNames = {"학생1", "학생2", "학생3"};
int[] studentAges = {15, 16, 17};
int[] studentGrades = {50, 60, 70};
for(int i = 0; i < studentNames.length; i++){
System.out.println("이름 "+studentNames[i]+" 나이 "+studentAges[i]+" 성적 "+studentGrades[i]);
}
}
}
클래스를 이용하면 아래와 같이 각각의 학생 별로 이름, 나이, 성적을 관리할 수 있다
package class1;
public class Student {
String name;
int age;
int grade;
}
클래스에 정의한 변수들을 멤버 변수 또는 필드라고 한다
멤버 변수 Member Variable 이 변수들은 특정 클래스에 소속된 멤버이기 때문에 이렇게 부른다
필드 Field 데이터 항목을 가리키는 전통적인 용어이다, 데이터베이스, 엑셀 등에서 데이터 각각의 항목을 필드라 한다
자바에서 멤버 변수와 필드는 같은 뜻이고, 클래스에 소속된 변수를 뜻한다
클래스는 관례상 대문자로 시작하고 낙타 표기법을 사용한다 ex) Student, User, MemberService
클래스와 사용자 정의 타입
타입은 데이터의 종류나 형태를 나타낸다 like int, String
클래스를 사용하면 int 나 String 같은 타입을 직접 만들 수 있다 (사실은 String 도 원래는 클래스이다)
사용자가 직접 정의하는 사용자 정의 타입을 만들려면 설계도가 필요하고, 이 설계도가 바로 클래스이다
설계도인 클래스를 사용해서 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라고 한다
(선생님이, 클래스는 붕어빵틀, 붕어빵은 객체 또는 인스턴스라고 비유했음)
클래스를 통해서 사용자가 원하는 종류의 데이터 타입을 정의할 수 있다
용어 - 클래스, 객체, 인스턴스
클래스는 설계도이고, 이 설계도를 기반으로 실제 메모리에 만들어진 실체를 객체 또는 인스턴스라 한다
예시에서 학생 Student 클래스를 기반으로 학생1 student1, 학생2 student2 객체 또는 인스턴스를 만들었다
객체 생성
stduent1 = new Student() // Student 인스턴스 생성
객체를 생성하려면 먼저 설계도인 클래스를 기반으로 객체 (인스턴스) 를 생성해야 한다
new Student() - new 는 새로 생성한다는 뜻이다, new Student() 는 Student 클래스 정보를 기반으로 새로운 객체를 생성하라는 뜻이고, 이렇게 하면 메모리에 실제 Student 객체 (인스턴스) 를 생성한다
객체를 생성할 때는 new 클래스명() 을 사용하면 된다
참조값 보관
객체를 생성하면 자바는 메모리 어딘가에 이 객체를 만들어두고, 이 객체에 접근할 수 있는 참조값 (주소) x001 을 반환한다
반환된 주소값을 student1 에 보관하여 이 변수를 통해 객체를 접근 (참조)할 수 있다
student1 변수를 통해 메모리에 있는 실제 객체를 접근하고 사용할 수 있다
Student student1 = new Student(); // 1. Student 객체 생성
Student student1 = x001; // 2. New Student() 의 결과로 x001 참조값 반환
student1 = x001; // 3. 최종 결과
객체에 값 대입 / 사용
/* 객체 값 대입 */
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
/* 객체 값 사용 */
System.out.println("이름 " + student1.name);
객체가 가지고 있는 멤버 변수에 값을 대입하려면 먼저 객체에 접근해야 한다 - x001 에 접근
객체에 접근하려면 . (점, dot) 키워드를 사용하여 값을 대입한다
클래스, 객체, 인스턴스 정리
클래스 Class
클랙스는 객체를 생성하기 위한 '틀' 또는 '설계도'
객체가 가져야 할 속성 (변수) 과 기능 (메서드) 를 정의한다
객체 Object
클래스에서 정의한 속성과 기능을 가진 실체, 객체는 서로 독립적인 상태를 가진다
ex. student1 은 학생1의 속성을 가지는 객체, student2 는 학생2의 속성을 가지는 객체, 둘은 서로 다른 객체이다
인스턴스 Instance
특정 크래스로부터 생성된 객체
인스턴스는 주로 객체가 어떤 클래스에 속해 있는지 강조할 때 사용한다
객체 vs 인스턴스
둘은 비슷하게 사용되지만, 인스턴스는 객체보다 좀 더 관계에 초점을 맞춘 단어이다 (특정 클래스와의 관계를 명확히 할 때 사용)
student1 은 객체이지만, 이 객체가 Student 클래스로부터 생성된다는 점을 명확히 하기 위해
student1 을 Student 의 인스턴스라고 부른다, 하지만 그냥 구분 없이 잘 사용한다
배열에 참조값 대입
Student[] students = new Student[2]; // 배열 생성
students[0] = student1;
students[1] = student2;
// Java 에서 대입은 항상 변수에 들어있는 값을 복한다
student[0] = x001;
student[1] = x002;
주의할 점은, 변수에는 인스턴스 자체가 들어있는 것이 아니라, 인스턴스의 위치를 가리키는 참조값이 들어있을 뿐이다
대입 ( = ) 시에 인스턴스가 복사되는 것이 아니라 참조값만 복사된다
자바에서 대입은, 항상 변수에 들어 있는 값을 복사한다
배열에 들어있는 객체 사용
배열에 들어있는 객체를 사용하려면 먼저 배열에 접근하고, 그 다음에 객체에 접근하면 된다
System.out.println(students[0].name); // 배열 접근 시작
System.out.println(x005[0].name); // [0]을 사용해서 x005 배열의 0번 요소에 접근
System.out.println(x001.name); // .(dot)을 사용해서 참조값으로 객체에 접근
System.out.println("학생1");
클래스 연습 문제
package class1.ex;
public class ProductOrder {
String productName; // 상품명
int price; // 가격
int quantity; // 주문 수량
}
package class1.ex;
public class ProductOrderMain {
public static void main(String[] args) {
int totalPrice = 0; // 총 결제 금액
/* 상품 주문 정보를 'ProductOrder' 타입의 변수로 받아 저장 */
ProductOrder product1 = new ProductOrder();
product1.productName = "두부";
product1.price = 2000;
product1.quantity = 2;
ProductOrder product2 = new ProductOrder();
product2.productName = "김치";
product2.price = 5000;
product2.quantity = 1;
ProductOrder product3 = new ProductOrder();
product3.productName = "콜라";
product3.price = 1500;
product3.quantity = 2;
/* 여러 상품의 주문 정보를 담는 배열 생성 */
ProductOrder[] products = {product1, product2, product3};
/* 상품 주문 정보와 최종 금액 출력 */
for (ProductOrder product : products) {
System.out.println("상품명 "+product.productName+", 가격 "+product.price+", 수량 "+product.quantity);
totalPrice += product.price * product.quantity;
}
System.out.println("총 결제 금액 "+totalPrice);
}
}
Class 를 이용하여 학생 정보 저장하고 출력하는 코드
package class1;
public class ClassStart3 {
public static void main(String[] args) {
Student student1;
/* 학생을 실제 메모리에 만들고 student 변수에 담는다 */
/* 리팩토링 후 */
student1 = new Student();
student1.name = "학생1";
student1.age = 15;
student1.grade = 90;
Student student2 = new Student();
student2.name = "학생2";
student2.age = 16;
student2.grade = 80;
Student[] students = {student1, student2};
/* Student 배열 리팩토링 전
Student[] students = new Student[2];
students[0] = student1;
students[1] = student2; */
/* Student 배열 출력 리팩토링 전 */
// System.out.println("이름 "+students[0].name+" 나이 "+ students[0].age+" 성적 "+students[0].grade);
// System.out.println("이름 "+students[1].name+" 나이 "+ students[1].age+" 성적 "+students[1].grade);
for(int i=0; i < students.length; i++) {
Student s = students[i]; // 배열의 요소를 꺼내서
System.out.println("이름 "+s.name+" 나이 "+ s.age+" 성적 "+s.grade);
}
/* 향상된 for 문 */
for(Student s: students) { /* 향상된 for 문으로 리팩토링도 가능 */
System.out.println("이름 "+s.name+" 나이 "+ s.age+" 성적 "+s.grade);
}
}
}
클래스를 사용할 때는 향상된 for 문 (Enhanced For Loop) 를 많이 사용한다
/* 향상된 for 문 */
for(Student s: students) {
System.out.println("이름 "+s.name+" 나이 "+ s.age+" 성적 "+s.grade);
}
'TIL > JAVA' 카테고리의 다른 글
[JAVA] 변수와 초기화 (0) | 2024.12.02 |
---|---|
[JAVA] 기본형과 참조형 (2) | 2024.11.26 |
[JAVA] 메서드 Method 2/2 (0) | 2024.11.13 |
[JAVA] 메서드 Method 1/2 (0) | 2024.11.12 |
[JAVA] 배열 Array (0) | 2024.11.08 |