Java공부(코딩)

코딩초보의 Java(자바)공부 6일차-2 { 기본형과 참조형 }

동곤일상 2024. 12. 12. 01:03
반응형

초보를 위한 코딩이론(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