초보를 위한 코딩이론(JAVA)
앞에서 기본형 , 참조형에대해
조금씩은 다룬 기억이 있네요.
이번에는 자세하게 알아봐요!!!
목차
1) 기본형 참조형
1-1) 기본형 참조형에 대해
1-2) 기본형 참조형 - 변수대입-
1-3) 기본형 참조형 - 메서드호출
1-4) 참조와 메서드활용 예제
1-5) 최종 예제
1) 기본형 참조형
1-1) 기본형 참조형에 대해
기본형 :
`int` , `long` , `double` , `boolean` 처럼 변수에 사용할 값을 직접 넣을 수 있는 데이
터 타입을 기본형이라 한다. 즉 값이 들어있다!
참조형 :
Student student1` , `int[] students` 와 같이 데이터에 접근하기 위한
주소(참조)를 저장하는 데이터 타입을 참조형이라 한다. 즉 위치가들어있다.
참조형은 객체 또는 배열에 사용 됨.
예외) String 은 참조형이지만 기본형처럼 문자대입 가능.
차이점)
기본 | 계산 | |
기본형 | 값을 변수에 담는다. 해당값을 바로 사용 가능 |
들어있는 값을 바로 계산가능 ex) + , - , * |
참조형 | 위치를 저장한다 객체 : .(dot)을 통해 생성된 객체를 찾아가야 사용가능 배열 : [] 를통해 배열을 찾아야 사용가능 |
계산 불가능 (실제 메모리가아니기때문) 멤버변수에 접근해서는 사용가능 |
참조형의 계산 예)
객체에 멤버변수에 접근하면 계산이 가능하긴 하다.
Student s1 = new Student();
s1.age = 15;
Student s2 = new Student();
s2.age = 20;
int sum = s1.age + s2.age; //연산 가능
1-2) 기본형 참조형의 변수대입
저번 블로그에서도 말씀드렸듯이자바에서
무조건 외워야하는 원칙
변수는 값을 복사해서 대입한다
(변수를 그냥 넣는것이 아니다)
힌트 : 참조형은 참조를 복사하겠죠?
기본형의 대입 예)
public static void main(String[] args) {
int a = 15;
int b = a;
System.out.println(" a : "+a);
System.out.println(" b : "+b);
System.out.println("a 변경 ");
a= 20;
System.out.println(" a : "+a);
System.out.println(" b : "+b);
System.out.println("b 변경 ");
b= 40;
System.out.println(" a : "+a);
System.out.println(" b : "+b);
}
a : 15
b : 15
a 변경
a : 20
b : 15
b 변경
a : 20
b : 40
값을 복사해서 대입한다는것을 생각해보면
int a = 15;
int b = a;
를 한 이후에 a 의값을 무엇으로바꾸든
b의값에는 영향이 없는 것이다.
위 코드는 (int b = 15) 와
같다고생각해라
참조형의 값 대입 예)
클래스
public class Num {
int number; }. 멤버변수(int)
메인 클래스
public static void main(String[] args) {
Num num1 = new Num();
num1.number = 19; //num1인스턴스의 주소를 찾아가 num 필드에 19 대입
Num num2 = num1; // num1의 주소값을 복사해서 num2 생성
System.out.println("객체 주소");
System.out.println("num1 : "+num1);
System.out.println("num2 : "+num2);
System.out.println("@@변경 전@@");
System.out.println("num1 : "+num1.number);
System.out.println("num2 : "+num2.number);
num1.number = 20;
System.out.println("@@num1.number = 20@@");
System.out.println("num1 : "+num1.number);
System.out.println("num2 : "+num2.number);
num2.number = 44;
System.out.println("@@num2.number = 44 @@");
System.out.println("num1 : "+num1.number);
System.out.println("num2 : "+num2.number);
}
결과
객체 주소
num1 : varChange.Num@87aac27
num2 : varChange.Num@87aac27
@@변경 전@@
num1 : 19
num2 : 19
@@num1.number = 20@@
num1 : 20
num2 : 20
@@num2.number = 44 @@
num1 : 44
num2 : 44
보시는 것 처럼 참조형은 주소값을 복사하므로
num1의값이 바뀌면 num2도 같이 바뀜.
(같은 인스턴스를 가리키고 있기 때문)
그림으로 간단하게 설명 드리자면
( 그림실력이 미흡한 점 양해부탁드립니다....)
결론 )
참조형의 값을 복사하면
같은 참조값을 가지므로
같은 객체인스턴스를 가르키게 된다.
1-3) 기본형 , 참조형 - 메서드호출 -
자바에서 메서드의 매개변수(파라미터)는 항상 값에 의해 전달된다.
그러나 이 값이 실제 값이냐, 참조(메모리 주소)값이냐에 따라
동작이 달라진다.
**기본형(실제값)
메서드로 기본형 데이터를 전달하면, 해당 값이 복사되어 전달된다.
이 경우, 메서드 내부에서 매개변수(파라미터)의 값을 변경해도,
호출자의 변수 값에는 영향이 없다.
**참조형(참조값):
메서드로 참조형 데이터를 전달하면, 참조값이 복사되어 전달된다.
이 경우, 메서드 내부에서 매개변수(파라미터)로 전달된
객체의 멤버 변수를 변경하면, 호출자의 객체도 변경된다.
1-4) 참조와 메서드활용 예제
인스턴스 생성과 동시에 값을 집어넣어보자!!
클래스)
public class Item {
String name;
int price;
int quantity;
}
메인 클래스)
public static void main(String[] args) {
Item item1 = createItem("당근", 1000, 3);
Item item2 = createItem("수박", 3500, 5);
printItem(item1);
printItem(item2);
}
private static Item createItem(String name , int price, int quantity) {
Item item = new Item();
item.name = name;
item.price = price;
item.quantity = quantity;
return item;
}
private static void printItem(Item item) {
System.out.println(item.name+" | 가격 : "+item.price+" | 수량 : "+item.quantity);
}
생성 메서드와 출력 메서드를 만들어
한눈에 보기쉽고 , 유지보수가
간편하게 설정해봤습니다 !!
(확장에 열려있어야 좋은 코드!)
OCP
1-5) 최종 예제
**요구 사항**
아래 입력, 출력 예시를 참고해서 다음 사항을 적용하자.주문 수량을 입력 받자
예) 입력할 주문의 개수를 입력하세요:
가격, 수량, 상품명을 입력 받자
입력시 상품 순서를 알 수 있게 "n번째 주문 정보를 입력하세요." 라는 메시지를 출력하세요.
입력이 끝나면 등록한 상품과 총 결제 금액을 출력하자.
입력, 출력 예시**
```
**정답**
입력할 주문의 개수를 입력하세요: 3
1번째 주문 정보를 입력하세요.
상품명: 두부
가격: 2000
수량: 2
2번째 주문 정보를 입력하세요.
상품명: 김치
가격: 5000
수량: 1
3번째 주문 정보를 입력하세요.
상품명: 콜라
가격: 1500
수량: 2
상품명: 두부, 가격: 2000, 수량: 2
상품명: 김치, 가격: 5000, 수량: 1
상품명: 콜라, 가격: 1500, 수량: 2
총 결제 금액: 12000
클래스)
public class Item {
String name;
int price;
int quantity;
}
메인 클래스 )
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("주문 할 상품의 갯수 입력 : ");
int a = scan.nextInt();
Item [] items = new Item[a];
int totalPrice = 0;
for (int i = 0; i < items.length; i++) {
scan.nextLine(); // \n 제거
System.out.println((i+1)+" 번째 상품 입력 :");
System.out.print("상품명 : ");
String name = scan.nextLine();
System.out.print("상품의 가격 : ");
int price = scan.nextInt();
System.out.print("상품의 수량 : ");
int quantity = scan.nextInt();
items[i] = createOrder(name, price, quantity);
System.out.println("주소 : "+items[i]);
totalPrice += price * quantity;
}
printOrders(items);//출력용
System.out.println("총 결제 금액 : "+totalPrice);
}
private static Item createOrder(String name, int price, int quantity) {
Item item = new Item();
item.name = name;
item.price = price;
item.quantity = quantity;
return item;
}
private static void printOrders(Item[] items) {
for (int i = 0; i < items.length; i++) {
System.out.println("상품명 : "+items[i].name+
"| 가격 : "+items[i].price+
"| 수량 : "+items[i].quantity);
}
}
createOrder로 item인스턴스가 반환된 후 배열로 들어가는 과정에서
참조값이 다르게 들어가는것을 제대로 보여주기위해
System.out.println("주소 : "+items[i]);
이렇게 주소값을 출력하는 문구 까지 넣어봤습니다
출력)
주문 할 상품의 갯수 입력 : 2
1 번째 상품 입력 :
상품명 : 바나나
상품의 가격 : 1500
상품의 수량 : 2
주소 : varChange_ex.Item@16b98e56
2 번째 상품 입력 :
상품명 : 당근
상품의 가격 : 1300
상품의 수량 : 3
주소 : varChange_ex.Item@27d6c5e0
상품명 : 바나나| 가격 : 1500| 수량 : 2
상품명 : 당근| 가격 : 1300| 수량 : 3
총 결제 금액 : 6900
'Java공부(코딩)' 카테고리의 다른 글
코딩초보의 자바(Java)공부 8일차 { 생성자 } (2) | 2024.12.13 |
---|---|
코딩초보의 Java(자바)공부 7일차 { 객체지향 프로그래밍 } (2) | 2024.12.12 |
코딩 초보의 Java(자바)공부 6일차 -클래스와 데이터- (2) | 2024.12.11 |
코딩초보의 Java(자바) 공부 5일차 { 메서드(Method) } (4) | 2024.12.11 |
코딩초보의Java (자바)4일차-2 (배열) (4) | 2024.12.10 |