개발자상식 <백엔드 개발자> (19)
[책리뷰 & Book review]
java의 call by value 란 무엇인가?
'값에 의한 전달(call by value)' 방식은 매개변수로 전달되는 값이 복사되어 전달되는 방식입니다. 자바에서는 모든 타입(기본 타입 및 참조 타입)이 이 방식으로 전달됩니다.
기본 타입의 값에 의한 전달
코드 예시:
java
public class Test {
public static void change(int x) {
x = 20;
}
public static void main(String[] args) {
int x = 10;
change(x);
System.out.println(x); // 출력: 10
}
}
설명: 위 코드에서 change 메서드에 x를 매개변수로 전달하면, x의 값 10이 복사되어 메서드로 전달됩니다. 따라서 메서드 내부에서 매개변수의 값을 변경해도 원본 변수 x의 값에는 영향을 주지 않습니다.
사용법: 메소드를 호출할 때 필요한 값을 인자로 전달합니다. 이 값은 메서드 내부에서 사용되며, 메서드가 종료되면 사라집니다.
참조 타입의 값에 의한 전달
코드 예시:
java
public class Test {
public static void change(int[] array) {
array[0] = 20;
}
public static void main(String[] args) {
int[] array = {10, 20, 30};
change(array);
System.out.println(array[0]); // 출력: 20
}
}
설명: 위 코드에서 change 메소드에 array를 매개변수로 전달하면, array의 참조값이 복사되어 메서드로 전달됩니다. 따라서 메서드 내부에서 매개변수를 통해 배열의 원소 값을 변경하면, 원본 배열의 원소 값도 변경됩니다. 이는 복사된 참조를 통해 원본 배열에 접근할 수 있기 때문입니다.
사용법: 메소드를 호출할 때 필요한 객체를 인자로 전달합니다. 메서드 내부에서는 이 객체의 참조를 통해 객체의 상태를 변경하거나 메서드를 호출할 수 있습니다. 하지만 참조 자체를 변경하는 것은 원본 참조에 영향을 주지 않습니다.
결론적으로, 자바의 '값에 의한 전달' 방식은 기본 타입의 경우 값 자체가, 참조 타입의 경우 참조값이 복사되어 전달되는 방식입니다. 이를 통해 메서드는 전달받은 값을 또는 참조를 통해 필요한 처리를 수행하게 됩니다.
메서드명과 배열의 데이터
public static void main(String[] args) {
int[] array = {10, 20, 30};
change(array);
System.out.println(array[0]); // 출력: 20
}
}
자바에서는 참조 타입의 매개변수를 메서드에 전달할 때, 그 참조값이 복사되어 전달됩니다. 이는 실제 데이터가 아닌 데이터를 가리키는 참조(주소)가 복사되어 전달된다는 것을 의미합니다.
아래는 위 코드의 동작 과정을 단계별로 상세하게 설명한 것입니다.
먼저 main 메소드 내에서 int [] array = {10, 20, 30}; 코드를 통해 array라는 이름의 정수 배열을 생성하고, 이 배열의 참조를 array 변수에 저장합니다. 이 시점에서 array 변수는 메모리 상의 배열을 가리키는 참조를 가지고 있습니다.
메모리 상태:
array ----> [10, 20, 30]
다음으로 change(array); 코드를 통해 change 메서드를 호출하고, array 변수가 가지고 있는 참조를 매개변수로 전달합니다. 이때, array의 참조값이 복사되어 change 메서드의 매개변수 array로 전달됩니다. 즉, change 메서드의 매개변수 array는 원본 array가 가리키는 같은 배열을 가리킵니다.
메모리 상태:
main의 array ----> [10, 20, 30] <---- change의 array
change 메소드 내에서 array [0] = 20; 코드를 통해 매개변수 array가 가리키는 배열의 첫 번째 원소 값을 20으로 변경합니다. 이는 change 메서드의 매개변수 array와 main 메서드의 array가 같은 배열을 가리키고 있기 때문에 가능합니다.
메모리 상태:
main의 array ----> [20, 20, 30] <---- change의 array
change 메소드가 종료되면, change 메서드의 매개변수 array는 사라집니다. 하지만 main 메서드의 array는 여전히 배열을 가리키고 있으며, 이 배열의 첫 번째 원소는 change 메서드에서 변경한 20입니다.
메모리 상태:
main의 array ----> [20, 20, 30]
마지막으로 System.out.println(array[0]); 코드를 통해 배열의 첫 번째 원소를 출력하면 20이 출력됩니다.
기본 타입과 참조 타입은 무엇인가 ?
자바에서 기본 타입은 byte, short, int, long, float, double, char, boolean 8가지이며,
참조 타입은 객체의 참조(주소)를 저장하며, 이에는 클래스 객체, 배열, 인터페이스 등이 포함됩니다.
객체의 참조(주소)란 무엇인가?
객체의 참조(주소)에 대한 과정을 이해하려면 먼저 객체 지향 프로그래밍과 힙 메모리에 대한 이해가 필요합니다. 자바에서는 객체를 참조변수를 통해 다룹니다. 이 참조변수는 객체가 저장 메모리의 주소를 가리킵니다.
아래는 이를 설명하는 코드 예시와 그에 대한 설명입니다.
java
public class Test {
public static void main(String[] args) {
String str = new String("Hello"); // 객체 생성
change(str);
System.out.println(str); // 출력: Hello
}
public static void change(String s) {
s = new String("Hi");
}
}
String str = new String("Hello");를 통해 Hello라는 값을 가진 String 객체를 생성하고, 그 참조(주소)를 str 변수에 저장합니다.
메모리 상태:
str ----> "Hello" (객체)
change(str);를 호출하면 str의 참조값이 change 메서드의 매개변수 s로 복사됩니다. 이제 s와 str은 같은 객체를 가리키고 있습니다.
메모리 상태:
main의 str ----> "Hello" <---- change의 s
change 메소드 내에서 s = new String("Hi");를 통해 새로운 String 객체를 생성하고 그 참조를 s에 저장합니다. 이제 s는 새로운 객체를 가리키지만, str는 여전히 원래의 객체를 가리킵니다.
메모리 상태:
main의 str ----> "Hello"
change의 s ----> "Hi" (새 객체)
따라서 change 메소드 호출 후에 System.out.println(str);를 실행하면 여전히 Hello가 출력됩니다.
이처럼, 참조 타입의 경우 변수는 객체의 참조(주소)를 저장하며, 이 참조를 통해 객체를 다룹니다. 이때 변수에 저장되는 값은 객체의 주소이며, 실제 객체는 힙 메모리에 저장됩니다. 이러한 방식을 통해 자바는 객체 지향 프로그래밍을 지원합니다.
객체의 참조(주소)와 변수의 차이점은 무엇이지?
객체의 참조(주소)와 변수의 차이점을 이해하려면 먼저 메모리 관리와 데이터 타입에 대한 이해가 필요합니다.
변수는 데이터를 저장하는 메모리 공간의 이름입니다. 변수는 주로 스택 메모리에 저장되며, 그 종류에 따라 저장하는 데이터의 타입과 크기가 결정됩니다.
**객체의 참조(주소)**는 힙 메모리에 생성된 객체를 가리키는 값입니다. 이는 참조 타입의 변수에 저장되며, 이를 통해 객체를 다룹니다.
아래는 이를 설명하는 코드 예시와 그에 대한 설명입니다.
java
public class Test {
public static void main(String[] args) {
int number = 10; // 기본 타입 변수
String str = new String("Hello"); // 참조 타입 변수
}
}
int number = 10;에서 number는 변수로, 10이라는 값을 직접 저장합니다. 이는 기본 타입인 int에 해당하며, 스택 메모리에 저장됩니다.
스택 메모리:
number ----> 10
String str = new String("Hello");에서 str은 참조 타입 변수로, new String("Hello")에 의해 생성된 객체의 참조(주소)를 저장합니다. 이 객체는 힙 메모리에 저장됩니다.
힙 메모리:
"Hello" (객체)
스택 메모리:
str ----> "Hello"의 참조
즉, number는 값을 직접 저장하는 변수이며, str은 객체의 참조를 저장하는 변수입니다.
str을 통해 Hello 객체를 다룰 수 있습니다.
따라서, 변수는 데이터를 저장하는 메모리 공간의 이름이며, 객체의 참조는 힙 메모리에 생성된 객체를 가리키는 값입니다. 이 두 가지는 데이터 타입과 메모리 관리 방식에 따라 구분됩니다.
스프링 MVC 패턴에서 JSP에 데이터
스프링 MVC 패턴에서 JSP에 데이터를 전달하고 출력하는 과정은 ModelAndView 객체를 사용합니다. 이 객체를 통해 Controller에서 View로 데이터를 전달하게 되며, 이 때 사용되는 데이터는 주로 동적 참조 타입입니다.
Controller에서 데이터 설정
java
@Controller
public class MyController {
@RequestMapping("/test")
public ModelAndView test() {
ModelAndView mav = new ModelAndView();
mav.addObject("message", "Hello, Spring MVC!"); // 동적 참조 타입
mav.setViewName("test");
return mav;
}
}
위의 코드에서 mav.addObject("message", "Hello, Spring MVC!");를 통해 ModelAndView 객체에 "message"라는 이름으로 "Hello, Spring MVC!"라는 String 객체를 추가하였습니다. 이는 동적 참조 타입이며, 런타임에 값이 결정됩니다.
JSP에서 데이터 출력
jsp
<!-- test.jsp -->
<html>
<body>
<h1>${message}</h1> // 동적 참조 타입 출력
</body>
</html>
위의 JSP 코드에서 ${message}를 통해 "message"라는 이름의 객체를 출력하였습니다. 이는 동적 참조 타입으로, 런타임에 "Hello, Spring MVC!"라는 값이 출력됩니다.
출력 결과
html
<html>
<body>
<h1>Hello, Spring MVC!</h1>
</body>
</html>
위의 HTML 코드는 최종 출력 결과입니다. 동적 참조 타입인
"message" 객체의 값이 "Hello, Spring MVC!"로 출력되었습니다.
따라서, 스프링 MVC 패턴에서 JSP로 데이터를 전달하고 출력하는 과정은 동적 참조 타입을 사용하며, 이는 런타임에 값이 결정되고 변경될 수 있습니다. 이러한 방식을 통해 동적인 웹 페이지를 생성할 수 있습니다.
#개발자취업 #개발자기초 #개발자 #개발자분야 #개발자분류 #개발자종류 #it개발자 #서버개발자 #개발자성장 #신입개발자 #ios개발자 #개발자노트북 #개발자 되는 법 #개발 #앱개발 #웹개발 #개발분야 #it개발 #개발공부 #코딩상식 #개발공부 #개발초보
#개발자취업 #개발자면접 #개발자채용 #백엔드개발자 #백엔드개발자 #백엔드개발자취업 #백엔드개발 #프런트엔드개발자 #개발자상담 #백엔드 #개발자 #앱개발자 #웹개발자 #개발자팁 #앱개발자 #백엔드취업 #백엔드공부 #백엔드강의 #백엔드독학
#전산직면접 #면접 #면접팁 #면접관 #공공기관전산직면접 #공사면접 #면접질문 #면접할 말 #면접준비 #면접준비 #면접답변 #면접질문 #면접기출 #전화면접 #면접복장 #면접답변 #면접꿀팁 #모의면접 #면접후기 #롯데면접 #면접후기 #임원면접 #최종면접 #면접꿀팁
'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
개발자상식 <백엔드 개발자> (21)[책리뷰 & Book review] (1) | 2024.01.25 |
---|---|
개발자상식 <백엔드 개발자> (20)[책리뷰 & Book review] (0) | 2024.01.24 |
개발자상식 <백엔드 개발자> (18)[책리뷰 & Book review] (1) | 2024.01.24 |
개발자상식 <백엔드 개발자> (17)[책리뷰 & Book review] (1) | 2024.01.24 |
댓글