개발자상식 <백엔드 개발자> (12)
[책리뷰 & Book review]
변수와 객체는 무슨 차이가 있는가?
객체와 변수에 대해 좀 더 쉽게 설명드리겠습니다.
객체(Object): 객체는 속성(변수)과 행동(메서드)을 가진 실체입니다.
예를 들어, '사람'이라는 객체가 있다면
'이름', '나이' 등이 속성이 되고 '걷다', '먹다' 등이 행동이 될 수 있습니다.
자바에서는 클래스를 통해 객체의 구조를 정의하고 new 연산자를 사용해 실제 객체를 생성합니다.
변수(Variable): 변수는 데이터를 저장하는 메모리 공간의 이름입니다. 변수에는 데이터를 저장할 수 있고, 저장된 데이터는 변경할 수 있습니다. 변수는 자료형을 가지며, 해당 자료형의 데이터만 저장할 수 있습니다.
이제 이 두 가지 개념을 'Person' 클래스를 예로 들어 설명해 보겠습니다.
java
public class Person {
String name; // 'name'이라는 변수(속성)
int age; // 'age'라는 변수(속성)
public Person(String name, int age) { // 생성자
this.name = name;
this.age = age;
}
public void introduce() { // 'introduce'라는 메소드(행동)
System.out.println("Hello, my name is " + name + " and I'm " + age + " years old.");
}
}
여기서 Person은 클래스로, 객체의 구조를 정의합니다.
name과 age는 변수로, 'Person' 객체의 속성을 나타냅니다.
introduce는 메소드로, 'Person' 객체의 행동을 나타냅니다.
이제 이 클래스를 기반으로 실제 'Person' 객체를 생성해보겠습니다.
java
Person person = new Person("John", 25);
new Person("John", 25) 부분이 'Person' 객체를 생성하는 코드입니다.
이 코드를 실행하면 메모리에 'Person' 객체가 생성되고, 그 주소가 person이라는 변수에 저장됩니다.
이렇게 생성된 객체는 person 변수를 통해 접근하고 사용할 수 있습니다.
변수가 되는 시점과 객체가 되는 시점은 무엇인가?
변수와 객체의 생성 시점을 코드에 주석으로 표시하여 설명하겠습니다.
java
public class Person {
// 이 시점에서 'name'과 'age' 변수가 선언되었습니다. 하지만 아직 객체는 생성되지 않았습니다.
String name;
int age;
// 'Person' 객체가 생성되는 시점입니다. 'new' 연산자를 통해 객체가 생성되며, 이때 생성자가 호출됩니다.
public Person(String name, int age) {
// 이 시점에서 'name'과 'age' 변수에 값이 할당됩니다.
this.name = name;
this.age = age;
}
public void introduce() {
System.out.println("Hello, my name is " + name + " and I'm " + age + " years old.");
}
}
java
// 이 코드를 실행하면 'Person' 객체가 메모리에 생성되고, 그 주소가 'person'이라는 변수에 저장됩니다.
Person person = new Person("John", 25);
위의 코드에서 Person person = new Person("John", 25); 부분이 'Person' 객체를 생성하는 코드입니다.
이 코드를 실행하면 메모리에 'Person' 객체가 생성되고, 그 주소가 person이라는 변수에 저장됩니다. 이렇게 생성된 객체는 person 변수를 통해 접근하고 사용할 수 있습니다. 이 시점에서 person은 'Person' 객체를 참조하는 변수가 됩니다.
Person person = new Person("John", 25); 에 대한 코드에 대한 정의를 풀어본다면?
코드 Person person = new Person("John", 25);의 각 부분이 수행하는 역할을 상세하게 설명하겠습니다.
Person : 이 부분은 변수의 타입을 나타냅니다. 여기서는 Person이라는 클래스 타입입니다.
person : 이 부분은 변수의 이름을 나타냅니다. 여기서는 person이라는 이름을 가진 변수를 선언합니다.
= : 이 부분은 대입 연산자입니다. 오른쪽의 값을 왼쪽의 변수에 할당합니다.
new : 이 부분은 새로운 객체를 생성하는 키워드입니다. new는 메모리에 새로운 공간을 할당하고 그 주소를 반환합니다.
Person("John", 25) : 이 부분은 Person 클래스의 생성자를 호출하는 부분입니다. ("John", 25)는 생성자에 전달되는 인자입니다.
이를 그림으로 나타내면 다음과 같습니다.
[메모리 구조]
└─ Stack 영역
└─ person 변수 (Person 객체의 주소를 저장)
└─ Heap 영역
└─ Person 객체 (name: "John", age: 25)
이렇게 new 키워드를 사용하여 Person 객체를 생성하고, 그 주소를 person이라는 변수에 저장하면,
이후에는 person 변수를 통해 Person 객체에 접근하고 그 속성이나 메서드를 사용할 수 있습니다.
예를 들어, person.introduce();와 같이 introduce 메소드를 호출할 수 있습니다.
Stack과 Heap과 java의 연관성은 무엇인가?
자바에서 메모리는 크게 스택(Stack) 영역과 힙(Heap) 영역으로 나눌 수 있습니다.
스택 영역: 스택 영역은 변수나 메소드의 호출 정보 등이 저장되는 공간입니다.
지역 변수, 매개 변수, 리턴 값 등이 이 영역에 저장됩니다. 함수 호출이 끝나면 자동으로 사라지는 특징이 있습니다.
힙 영역: 힙 영역은 동적으로 할당된 메모리 공간이 저장되는 공간입니다. 즉, 객체가 이 영역에 저장됩니다.
new 키워드를 사용해서 생성된 객체는 모두 이 영역에 생성되며, 가비지 컬렉터에 의해 관리됩니다.
자바 코드를 통해 이 두 영역의 관계를 이해해 봅시다.
java
public class Main {
public static void main(String[] args) {
Person person = new Person("John", 25); // 1번 라인
person.introduce(); // 2번 라인
}
}
위 코드에서 1번 라인을 보면, Person 객체가 new 키워드를 통해 생성되고, 이 객체는 힙 영역에 저장됩니다.
person이라는 변수는 이 Person 객체의 주소를 가지게 되며, 이 변수는 스택 영역에 저장됩니다.
2번 라인에서 person.introduce();를 호출하면, introduce 메서드가 스택 영역에 쌓이게 됩니다.
메서드 호출이 끝나면 스택에서 사라지게 됩니다.
이를 그림으로 표현하면 다음과 같습니다.
[메모리 구조]
└─ Stack 영역 (메소드 호출 정보, 변수 등)
└─ main 메소드
└─ person 변수 (Person 객체의 주소를 저장)
└─ introduce 메소드 (호출 중)
└─ Heap 영역 (객체)
└─ Person 객체 (name: "John", age: 25)
이처럼 자바에서는 스택 영역과 힙 영역을 통해 메서드 호출 정보, 변수, 객체 등을 메모리에 저장하고 관리합니다.
stack과 힙 영역을 담당하는 구조?
Spring과 Spring Boot는 Java 언어를 사용하는 웹 애플리케이션 개발 프레임워크이며, Java의 메모리 관리 구조인 스택(Stack)과 힙(Heap) 영역을 따릅니다. 이들 프레임워크는 메모리를 직접 관리하지 않고, Java 가상 머신(JVM)이 메모리를 관리하도록 합니다.
즉, Spring과 Spring Boot에서의 객체 생성, 메서드 호출 등이 일어나면 이는 내부적으로 Java의 스택과 힙 영역에서 처리됩니다.
그럼 Spring Boot를 사용하여 간단한 웹 애플리케이션을 만드는 예제를 살펴봅시다.
java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args); // 1번 라인
}
}
위의 코드에서 SpringApplication.run(Application.class, args); 부분이 Spring Boot 애플리케이션을 시작하는 코드입니다. 이 코드를 실행하면 내부적으로 여러 객체가 생성되고 메소드가 호출됩니다. 이때 생성된 객체는 힙 영역에, 메서드 호출 정보는 스택 영역에 저장됩니다.
Spring과 Spring Boot는 MVC(Model-View-Controller) 패턴
Spring과 Spring Boot는 MVC(Model-View-Controller) 패턴을 사용하여 웹 애플리케이션을 구성할 수 있습니다.
MVC 패턴은 애플리케이션을 모델, 뷰, 컨트롤러 세 부분으로 나누어 구성하는 방법입니다.
모델(Model): 데이터와 비즈니스 로직을 처리하는 부분입니다.
뷰(View): 사용자에게 보여지는 부분으로, 일반적으로 HTML, CSS, JS 등을 사용하여 구성합니다.
컨트롤러(Controller): 사용자의 요청을 받아 적절한 모델을 호출하고, 그 결과를 뷰에 전달하는 역할을 합니다.
이를 Spring Boot에서 구현한 간단한 예제 코드와 그림으로 보여드리겠습니다.
java
// 컨트롤러
@Controller
public class MyController {
@Autowired
private MyService myService; // 모델
@RequestMapping("/")
public String index(Model model) {
String message = myService.getMessage();
model.addAttribute("message", message); // 뷰에 데이터 전달
return "index"; // 뷰 이름 반환
}
}
// 모델
@Service
public class MyService {
public String getMessage() {
return "Hello, Spring Boot!";
}
}
위의 코드에서 MyController는 컨트롤러, MyService는 모델에 해당합니다. 사용자가 "/" URL에 접속하면 index 메서드가 호출되고, 이 메서드에서는 MyService의 getMessage 메서드를 호출하여 메시지를 받아옵니다. 이 메시지를 뷰에 전달하고, 뷰 이름을 반환합니다.
이를 그림으로 나타내면 다음과 같습니다.
[사용자] --요청--> [MyController (컨트롤러)] --호출--> [MyService (모델)]
|
v
[사용자] <--응답-- [MyController (컨트롤러)] <--결과-- [MyService (모델)]
이처럼 MVC 패턴을 사용하면 사용자 요청 처리 흐름을 명확하게 파악할 수 있으며, 각 부분을 독립적으로 개발하고 테스트할 수 있어 유지보수성이 향상됩니다.
#개발자취업 #개발자기초 #개발자 #개발자분야 #개발자분류 #개발자종류 #it개발자 #서버개발자 #개발자성장 #신입개발자 #ios개발자 #개발자노트북 #개발자되는법 #개발 #앱개발 #웹개발 #개발분야 #it개발 #개발공부 #코딩상식 #개발공부 #개발초보
#개발자취업 #개발자면접 #개발자채용 #백엔드개발자 #백엔드개발자 #백엔드개발자취업 #백엔드개발 #프론트엔드개발자 #개발자상담 #백엔드 #개발자 #앱개발자 #웹개발자 #개발자팁 #앱개발자 #백엔드취업 #백엔드공부 #백엔드강의 #백엔드독학
#전산직면접 #면접 #면접팁 #면접관 #공공기관전산직면접 #공사면접 #면접질문 #면접할말 #면접준비 #면접준비 #면접답변 #면접질문 #면접기출 #전화면접 #면접복장 #면접답변 #면접꿀팁 #모의면접 #면접후기 #롯데면접 #면접후기 #임원면접 #최종면접 #면접꿀팁
'컴퓨터공부 > 책리뷰 & book review' 카테고리의 다른 글
개발자상식 <백엔드 개발자> (14)[책리뷰 & Book review] (1) | 2024.01.24 |
---|---|
개발자상식 <백엔드 개발자> (13)[책리뷰 & Book review] (0) | 2024.01.23 |
개발자상식 <백엔드 개발자> (11)[책리뷰 & Book review] (0) | 2024.01.23 |
개발자상식 <백엔드 개발자> (10)[책리뷰 & Book review] (1) | 2024.01.23 |
댓글