중복되지 않게 음식 이름을 출력하게하는 코드.
Random random = new Random();
//음식 주문의 개수가 랜덤이기에 랜덤 숫자 가져온다.
int orders = random.nextInt(5) + 1;
leftMainPanel.add(new JLabel(orders + "개의 주문이 들어왔습니다. 순서대로 음식을 준비해주세요."));
ArrayList<Food> foodArrayList = new ArrayList<>(foodList);
for (int i = 0; i < orders; i += 1) {
int index = random.nextInt(orders - i);
leftMainPanel.add(new JLabel((i+1)+". "+foodArrayList.get(index).getFoodName()));
foodOrderList.add(foodArrayList.get(index).getFoodName());
foodArrayList.remove(index);
}
1.자바 컴파일 순서
- 개발자가 자바 소스코드(.java)를 작성합니다.
- 자바 컴파일러(Java Compiler)가 자바 소스파일을 컴파일합니다. 이때 나오는 파일은 자바 바이트 코드(.class)파일로 아직 컴퓨터가 읽을 수 없는 자바 가상 머신이 이해할 수 있는 코드입니다. 바이트 코드의 각 명령어는 1바이트 크기의 Opcode와 추가 피연산자로 이루어져 있습니다.
- 컴파일된 바이트 코드를 JVM의 클래스로더(Class Loader)에게 전달합니다.
- 클래스 로더는 동적로딩(Dynamic Loading)을 통해 필요한 클래스들을 로딩 및 링크하여 런타임 데이터 영역(Runtime Data area), 즉 JVM의 메모리에 올립니다.
- 클래스 로더 세부 동작
- 로드 : 클래스 파일을 가져와서 JVM의 메모리에 로드합니다.
- 검증 : 자바 언어 명세(Java Language Specification) 및 JVM 명세에 명시된 대로 구성되어 있는지 검사합니다.
- 준비 : 클래스가 필요로 하는 메모리를 할당합니다. (필드, 메서드, 인터페이스 등등)
- 분석 : 클래스의 상수 풀 내 모든 심볼릭 레퍼런스를 다이렉트 레퍼런스로 변경합니다.
- 초기화 : 클래스 변수들을 적절한 값으로 초기화합니다. (static 필드)
- 클래스 로더 세부 동작
- 실행엔진(Execution Engine)은 JVM 메모리에 올라온 바이트 코드들을 명령어 단위로 하나씩 가져와서 실행합니다. 이때, 실행 엔진은 두가지 방식으로 변경합니다.
- 인터프리터 : 바이트 코드 명령어를 하나씩 읽어서 해석하고 실행합니다. 하나하나의 실행은 빠르나, 전체적인 실행 속도가 느리다는 단점을 가집니다.
- JIT 컴파일러(Just-In-Time Compiler) : 인터프리터의 단점을 보완하기 위해 도입된 방식으로 바이트 코드 전체를 컴파일하여 바이너리 코드로 변경하고 이후에는 해당 메서드를 더이상 인터프리팅 하지 않고, 바이너리 코드로 직접 실행하는 방식입니다. 하나씩 인터프리팅하여 실행하는 것이 아니라 바이트 코드 전체가 컴파일된 바이너리 코드를 실행하는 것이기 때문에 전체적인 실행속도는 인터프리팅 방식보다 빠릅니다.
2.반복의 3요소
- 초기화: 반복문이 시작되기 전에 초기값을 설정합니다. 이는 일반적으로 카운터 변수를 초기화하는 것이며, 반복문에서 사용될 다른 변수들도 초기화할 수 있습니다.
- 조건: 반복문이 실행될 조건을 지정합니다. 조건은 불리언(Boolean) 값으로 평가되며, 조건이 참(True)인 동안에만 반복문이 실행됩니다.
- 증감: 반복문이 한 번 실행된 후에는 일반적으로 카운터 변수를 증가시키는 등의 작업을 수행합니다. 이를 통해 조건이 거짓(False)이 되어 반복문이 종료될 수 있도록 합니다.
3.String 배열의 이름을 array라 하고 요소는 "a","b","c"이면서 배열의 이름을 선언하고 할당하는 코드를 각각의 원소를 for each문으로 출력.
String[] array = new String{"a","b","c"}
for(String name : array){
System.out.prin(name)
}
4.라이브러리와 프레임워크의 차이
라이브러리는 일반적으로 독립적으로 사용할 수 있는 함수나 클래스의 집합입니다. 라이브러리는 개발자가 필요할 때마다 호출해서 사용할 수 있습니다. 라이브러리를 사용하면 개발자가 같은 기능을 수행하는 코드를 반복해서 작성하지 않아도 되므로, 개발 시간을 단축시키고 코드의 재사용성을 높일 수 있습니다. 예를 들어, Java에서는 자주 사용하는 기능을 제공하는 라이브러리로 Java API, Apache Commons 등이 있습니다.
프레임워크는 라이브러리와 마찬가지로 재사용 가능한 코드의 집합이지만, 라이브러리와는 달리 프레임워크는 개발자가 작성하는 애플리케이션의 구조를 정의합니다. 즉, 개발자는 프레임워크에서 정의된 규칙에 따라 코드를 작성하고, 프레임워크가 이를 실행시켜서 애플리케이션을 구동시킵니다. 프레임워크는 개발자가 애플리케이션의 핵심 비즈니스 로직에만 집중할 수 있도록, 애플리케이션 개발을 더 쉽고 빠르게 만들어주는 역할을 합니다. 예를 들어, Java에서는 웹 애플리케이션을 개발하는 데 사용되는 프레임워크로 Spring, Struts 등이 있습니다.
라이브러리와 프레임워크는 둘 다 소프트웨어 개발에서 중요한 역할을 합니다. 라이브러리는 개발자가 필요할 때마다 사용할 수 있고, 프레임워크는 애플리케이션 개발을 더 쉽고 빠르게 만들어줍니다.
6. 객체지향 프로그램과 절차적 프로그램의 차이를 캡슐화 개념을 통해 설명
객체지향 프로그래밍과 절차적 프로그래밍의 가장 큰 차이는 캡슐화의 개념을 얼마나 활용하는가에 있습니다. 캡슐화는 객체지향 프로그래밍에서 매우 중요한 개념으로, 관련된 데이터와 메서드를 함께 묶어 객체를 생성하고, 이를 외부에서 직접적으로 접근하지 못하도록 제한하는 것입니다.
절차적 프로그래밍에서는 데이터와 함수가 서로 분리되어 있습니다. 데이터는 전역 변수로 선언되고 함수는 데이터에 직접 접근하여 수정할 수 있습니다. 이로 인해 함수를 수정하면 데이터가 어떻게 변경되는지 파악하기 어렵고, 데이터에 대한 보호나 제한이 없습니다. 데이터가 외부에서 직접적으로 접근 가능하기 때문에, 데이터의 무결성이 보장되지 않습니다.
반면 객체지향 프로그래밍에서는 데이터와 메서드가 하나의 객체 안에 캡슐화되어 있습니다. 객체를 통해 데이터에 접근하고 수정하는 메서드를 호출합니다. 이렇게 함으로써 데이터의 접근을 제한할 수 있습니다. 객체를 사용하면 데이터와 관련된 모든 기능이 함께 묶여 있으므로 코드를 이해하기 쉽고, 데이터의 무결성을 보장할 수 있습니다.
또한, 객체지향 프로그래밍에서는 상속을 통해 코드의 재사용성을 높일 수 있습니다. 부모 클래스에서 정의된 메서드와 데이터를 자식 클래스에서 상속받아 사용할 수 있습니다. 이는 코드의 중복을 줄이고 유지보수를 용이하게 만듭니다.
결론적으로, 객체지향 프로그래밍은 데이터와 메서드를 함께 묶어 객체를 생성하고, 객체를 통해 데이터에 접근하고 수정하는 방식으로 캡슐화를 활용합니다. 이에 반해, 절차적 프로그래밍은 데이터와 함수가 분리되어 있고, 데이터에 대한 보호나 제한이 없습니다. 이로 인해 객체지향 프로그래밍은 코드의 재사용성과 유지보수성을 높일 수 있습니다.
8. Account 클래스에 account생성자를 만드는데 매개변수는 없다.
생성자는 잔액1000원과 계좌번호 1234를 가지고있다.
public class Account{
private int amount =1000;
private String accountNumber = "1234";
Account(){
}
}
9.Value Object와 entity의 차이
Value Object와 Entity는 객체지향 프로그래밍에서 객체를 구성하는 두 가지 중요한 개념입니다. 이 둘 사이의 차이점을 설명하자면 다음과 같습니다.
- Identity(식별성)의 유무:
- Value Object는 Identity가 없거나 구분될 필요가 없는 객체입니다.
- Entity는 Identity가 있으며, 다른 객체와 구별할 수 있는 식별자(주로 고유 ID)를 갖습니다.
- Immutability(불변성)의 유무:
- Value Object는 Immutable(불변)한 속성을 갖는 경우가 많습니다. 객체를 생성한 후 변경할 수 없는 속성을 갖고 있어, 객체의 상태가 변하지 않습니다.
- Entity는 Mutable(가변)한 속성을 갖습니다. 객체를 생성한 후, 속성값을 변경할 수 있으며, 이를 통해 객체의 상태가 변합니다.
- Equality(동등성) 비교:
- Value Object는 동일한 값을 갖는 객체는 모두 같은 것으로 취급합니다.
- Entity는 객체의 Identity(식별자)가 같을 때 같은 것으로 취급합니다.
- Business Rule에 대한 처리:
- Value Object는 값을 표현하기 위한 객체이며, 비즈니스 로직을 처리하는 기능을 갖지 않습니다.
- Entity는 데이터와 함께 비즈니스 로직을 처리하는 역할을 합니다. 다른 Entity나 Value Object와 연관성을 갖는 관계를 통해 복잡한 비즈니스 로직을 구현할 수 있습니다.
따라서, Value Object는 Immutable하고 Identity를 갖지 않으며, Equality 비교에 의해 같은 것으로 취급됩니다. Entity는 Mutable하고 Identity를 갖으며, Equality 비교에 의해 같은 것으로 취급됩니다. 이러한 차이점을 고려하여, 객체를 설계하고 구현하는데 활용할 수 있습니다.
'TIL' 카테고리의 다른 글
Day35(퀘스트 하면서 겪은 참조형타입 비교, 자바의 특징,JVM,Lamda,추상화) (0) | 2023.03.08 |
---|---|
Day34(반복문을 사용하는 경우) (0) | 2023.03.07 |
Day32(입력받은 값이 비어 있지 않고, 숫자로 이루어져 있는지를 확인하는 조건문) (0) | 2023.03.05 |
Day31(객체지향 프로그래밍,생성자,오퍼레이션,결합도,List와ArrayList차이점,구현체,인터페이스) (0) | 2023.03.04 |
Day30(예약어,List,Class,생성자,this,도메인 모델, 상속,위임,오버로딩,라이브러리) (0) | 2023.03.03 |