대학레포트

고객센터 안내 (02)539-9392 평일 : 오전 09:00 ~ 오후 18:00 점심시간 : 12:00 ~ 13:00 토, 일, 법정공휴일 휴무

  • img
  • 12 다형성과 설계
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편12. 다형성과 설계#1.인강/0.자바/2.자바-기본/좋은 객체 지향 프로그래밍이란?/다형성 - 역할과 구현 예제1/다형성 - 역할과 구현 예제2/다형성 - 역할과 구현 예제3/OCP(Open-Closed Principle) 원칙/문제와 풀이/정리좋은 객체 지향 프로그래밍이란? 다형성 - 역할과 구현 예제1앞서 설명한 내용을 더 깊이있게 이해하기 위해, 간단한 운전자와 자동차의 관계를 개발해보자. 먼저 다형성을 사용하지않고, 역할과 구현을 분리하지 않고 단순하게 개발해보자.`Driver `는 `K3Car `를 운전하는 프로그램이다.```javapackage poly.car0;public class K3Car public void startEngine() System.out.println(K3Car.startEngine);public void offEngine() System.out.println(K3Car.offEngine);public void pressAccelerator() System.out.println(K3Car.pressAccelerator);```javapackage poly.car0;public class Driver private K3Car k3Car;public void setK3Car(K3Car k3Car) this.k3Car = k3Car;public void drive() System.out.println(자동차를 운전합니다.);k3Car.startEngine();k3Car.pressAccelerator();k3Car.offEngine();```javapackage poly.car0;public class CarMain0 public static void main(String args) Driver driver = new Driver();K3Car k3Car = new K3Car();driver.setK3Car(k3Car);driver.drive();````Driver `와 `K3Car `를 먼저 생성한다. 그리고 `driver.setK3Car() `를 통해 `driver `에게 `k3Car `의 참조를 넘겨준다.`driver.driver() `를 호출한다.**실행 결과**```자동차를 운전합니다.K3Car.startEngineK3Car.pressAcceleratorK3Car.offEngine```**메모리 그림** 다형성 - 역할과 구현 예제2새로운 Model3 차량을 추가해야 하는 요구사항이 들어왔다. 이 요구사항을 맞추려면 기존에 `Driver ` 코드를 많이 변경해야 한다.드라이버는 `K3Car `도 운전할 수 있고, `Model3Car `도 운전할 줄 있어야 한다. 참고로 둘을 동시에 운전하는 것은 아니다.```javapackage poly.car0;public class Model3Car public void startEngine() System.out.println(Model3Car.startEngine);public void offEngine() System.out.println(Model3Car.offEngine);public void pressAccelerator() System.out.println(Model3Car.pressAccelerator);```**Driver - 코드 변경**```javapackage poly.car0;public class Driver private K3Car k3Car;

    2024.05.11 / 31pages ( 대학레포트 > 시험/강의/학업)

    태그 역할 다형성 , 코드 구현 , 12 다형성과 설계
  • img
  • 11 다형성2
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편11. 다형성2#1.인강/0.자바/2.자바-기본/다형성 활용1/다형성 활용2/다형성 활용3/추상 클래스1/추상 클래스2/인터페이스/인터페이스 - 다중 구현/클래스와 인터페이스 활용/정리다형성 활용1지금까지 학습한 다형성을 왜 사용하는지, 그 장점을 알아보기 위해 우선 다형성을 사용하지 않고 프로그램을 개발한 다음에 다형성을 사용하도록 코드를 변경해보자.아주 단순하고 전통적인 동물 소리 문제로 접근해보자.개, 고양이, 소의 울음 소리를 테스트하는 프로그램을 작성해보자. 먼저 다형성을 사용하지 않고 코드를 작성해보자.**참고**: `Caw`는 오타입니다. 대신에 `Cow`로 정정해야 맞습니다. 강의 내용과 영상 전반에 `Cow`를 너무 많이 사용해서, 고치면 코드를 따라갈 때 혼란스러울 수 있어서, 오타이지만 부득이하게 `Caw`로 유지하겠습니다.예제1```javapackage poly.ex1;public class Dog public void sound() System.out.println(멍멍);```javapackage poly.ex1;public class Cat public void sound() System.out.println(냐옹);```javapackage poly.ex1;public class Caw public void sound() System.out.println(음매);```javapackage poly.ex1;public class AnimalSoundMain public static void main(String args) Dog dog = new Dog();Cat cat = new Cat();Caw caw = new Caw();System.out.println(동물 소리 테스트 시작);dog.sound();System.out.println(동물 소리 테스트 종료);System.out.println(동물 소리 테스트 시작);cat.sound();System.out.println(동물 소리 테스트 종료);System.out.println(동물 소리 테스트 시작);caw.sound();System.out.println(동물 소리 테스트 종료);```**실행 결과**```동물 소리 테스트 시작멍멍동물 소리 테스트 종료동물 소리 테스트 시작냐옹동물 소리 테스트 종료동물 소리 테스트 시작음매동물 소리 테스트 종료```단순히 개, 고양이, 소 동물들의 울음 소리를 출력하는 프로그램이다. 만약 여기서 새로운 동물이 추가되면 어떻게 될까?만약 기존 코드에 소가 없었다고 가정해보자, 소가 추가된다고 가정하면 `Caw` 클래스를 만들고 다음 코드도 추가해야한다.```java//Caw를 생성하는 코드Caw caw = new Caw();//Caw를 사용하는 코드System.out.println(동물 소리 테스트 시작);caw.sound();System.out.println(동물 소리 테스트 종료);````Caw`를 생성하는 부분은 당연히 필요하니 크게 상관이 없지만, `Dog`, `Cat`, `Caw`를 사용해서 출력하는 부분은 계속 중복이 증가한다.**중복 코드**```javaSystem.out.println(동물 소리 테스트 시작);dog.sound();System.out.println(동물 소리 테스트 종료);System.out.println(동물 소리 테스트 시작);cat.sound();System.out.println(동물 소리 테스트 종료);.```이 부분의 중복을 제거할 수 있을까?중복을 제거하기 위해서는 메서드를 사용하거나, 또는 배열과 `for`문을 사용하면 된다.그런데 `Dog`, `Cat`, `Caw`는 서로 완전히 다른 클래스다.중복 제거 시도**메서드로 중복 제거 시도**메서드를 사용하면 다음과 같이 매개변수의 클래스를 `Caw`, `Dog`, `Cat`중에 하나로 정해야 한다.```javaprivate static void soundCaw(Caw caw) System.out.println(동물 소리 테스트 시작);caw.sound();System.out.println(동물 소리 테스트 종료);```따라서 이 메서드는 `Caw` 전용 메서드가 되고 `Dog`, `Cat`은 인수로 사용할 수 없다.`Dog`, `Cat`, `Caw`의 타입(클래스)이 서로 다르기 때문에 `soundCaw ` 메서드를 함께 사용하는 것은 불가능하다.**배열과 for문을 통한 중복 제거 시도**```javaCaw cawArr = cat, dog, caw; //컴파일 오류 발생!System.out.println(동물 소리 테스트 시작);for (Caw caw : cawArr) cawArr.sound();System.out.println(동물 소리 테스트 종료);```배열과 for문 사용해서 중복을 제거하려고 해도 배열의 타입을 `Dog`, `Cat`, `Caw` 중에 하나로 지정해야 한다. 같은`Caw`들을 배열에 담아서 처리하는 것은 가능하지만 타입이 서로 다른 `Dog`, `Cat`, `Caw`을 하나의 배열에 담는 것은 불가능하다.결과적으로 지금 상황에서는 해결 방법이 없다. 새로운 동물이 추가될 때 마다 더 많은 중복 코드를 작성해야 한다.지금까지 설명한 모든 중복 제거 시도가 `Dog`, `Cat`, `Caw`의 타입이 서로 다르기 때문에 불가능하다. **문제의 핵심은 바로 타입이 다르다는 점**이다. 반대로 이야기하면 `Dog`, `Cat`, `Caw`가 모두 같은 타입을 사용할 수 있는 방법이 있다면메서드와 배열을 활용해서 코드의 중복을 제거할 수 있다는 것이다.다형성의 핵심은 다형적 참조와 메서드 오버라이딩이다. 이 둘을 활용하면 `Dog`, `Cat`, `Caw`가 모두 같은 타입을 사용하고, 각자 자신의 메서드도 호출할 수 있다.다형성 활용2이번에는 앞서 설명한 예제를 다형성을 사용하도록 변경해보자.예제2다형성을 사용하기 위해 여기서는 상속 관계를 사용한다. `Animal `(동물) 이라는 부모 클래스를 만들고 `sound() ` 메서드를 정의한다. 이 메서드는 자식 클래스에서 오버라이딩 할 목적으로 만들었다.`Dog`, `Cat`, `Caw`는 `Animal ` 클래스를 상속받았다. 그리고 각각 부모의 `sound() ` 메서드를 오버라이딩 한다.기존 코드를 유지하기 위해 새로운 패키지를 만들고 새로 코드를 작성하자.**주의! 패키지 이름에 주의하자 `import `를 사용해서 다른 패키지에 있는 같은 이름의 클래스를 사용하면 안된다.**```javapackage poly.ex2;public class Animal public void sound() System.out.println(동물 울음 소리);```javapackage poly.ex2;public class Dog extends Animal @Overridepublic void sound() System.out.println(멍멍);```javapackage poly.ex2;public class Cat extends Animal @Overridepublic void sound() System.out.println(냐옹);```javapackage poly.ex2;public class Caw extends Animal@Overridepublic void sound() System.out.println(음매);```javapackage poly.ex2;public class AnimalPolyMain1 public static void main(String args) Dog dog = new Dog();Cat cat = new Cat();Caw caw = new Caw();soundAnimal(dog);soundAnimal(cat);soundAnimal(caw);//동물이 추가 되어도 변하지 않는 코드private static void soundAnimal(Animal animal) System.out.println(동물 소리 테스트 시작);animal.sound();System.out.println(동물 소리 테스트 종료);```**실행 결과**```동물 소리 테스트 시작멍멍동물 소리 테스트 종료동물 소리 테스트 시작냐옹동물 소리 테스트 종료동물 소리 테스트 시작음매동물 소리 테스트 종료```실행 결과는 기존 코드와 같다.**코드를 분석해보자.**`soundAnimal(dog) `을 호출하면`soundAnimal(Animal animal) `에 `Dog` 인스턴스가 전달된다.`Animal animal = dog `로 이해하면 된다. 부모는 자식을 담을 수 있다. `Animal `은 `Dog`의 부모다.메서드 안에서 `animal.sound() ` 메서드를 호출한다.`animal ` 변수의 타입은 `Animal `이므로 `Dog` 인스턴스에 있는 `Animal ` 클래스 부분을 찾아서 `sound() ` 메서드를 실행한다. 그런데 하위 클래스인 `Dog`에서 `sound() ` 메서드를 오버라이딩 했다. 따라서 오버라이딩한메서드가 우선권을 가진다.`Dog` 클래스에 있는 `sound() ` 메서드가 호출되므로 멍멍이 출력된다.이 코드의 핵심은 `Animal animal ` 부분이다.**다형적 참조** 덕분에 `animal ` 변수는 자식인 `Dog`, `Cat`, `Caw`의 인스턴스를 참조할 수 있다. (부모는 자식을 담

    2024.05.11 / 35pages ( 대학레포트 > 시험/강의/학업)

    태그 다형성 동물 , 테스트 소리 , 11 다형성2
  • img
  • 10 다형성1
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편10. 다형성1#1.인강/0.자바/2.자바-기본/다형성 시작/다형성과 캐스팅/캐스팅의 종류/다운캐스팅과 주의점/instanceof/다형성과 메서드 오버라이딩/정리다형성 시작객체지향 프로그래밍의 대표적인 특징으로는 캡슐화, 상속, 다형성이 있다. 그 중에서 다형성은 객체지향 프로그래밍의꽃이라 불린다.앞서 학습한 캡슐화나 상속은 직관적으로 이해하기 쉽다. 반면에 다형성은 제대로 이해하기도 어렵고, 잘 활용하기는 더어렵다. 하지만 좋은 개발자가 되기 위해서는 다형성에 대한 이해가 필수다.다형성(Polymorphism)은 이름 그대로 다양한 형태, 여러 형태를 를 뜻한다.프로그래밍에서 다형성은 한 객체가 여러 타입의 객체로 취급될 수 있는 능력을 뜻한다. 보통 하나의 객체는 하나의 타입으로 고정되어 있다. 그런데 다형성을 사용하면 하나의 객체가 다른 타입으로 사용될 수 있다는 뜻이다. 지금은 이 내용을 이해하기 보다는 참고만 해두자.이제부터 본격적으로 다형성을 학습해보자.다형성을 이해하기 위해서는 크게 2가지 핵심 이론을 알아야 한다.**다형적 참조****메서드 오버라이딩**먼저 다형적 참조라 불리는 개념에 대해 알아보자.다형적 참조다형적 참조를 이해하기 위해 다음과 같은 간단한 상속 관계를 코드로 만들어보자.부모와 자식이 있고, 각각 다른 메서드를 가진다.```javapackage poly.basic;public class Parent public void parentMethod() System.out.println(Parent.parentMethod);```javapackage poly.basic;public class Child extends Parent public void childMethod() System.out.println(Child.childMethod);```javapackage poly.basic;/*** 다형적 참조: 부모는 자식을 품을 수 있다.*/public class PolyMain public static void main(String args) //부모 변수가 부모 인스턴스 참조System.out.println(Parent -> Parent);Parent parent = new Parent();parent.parentMethod();//자식 변수가 자식 인스턴스 참조System.out.println(Child -> Child);Child child = new Child();child.parentMethod();child.childMethod();//부모 변수가 자식 인스턴스 참조(다형적 참조)System.out.println(Parent -> Child);Parent poly = new Child();poly.parentMethod();//Child child1 = new Parent(); 자식은 부모를 담을 수 없다.//자식의 기능은 호출할 수 없다. 컴파일 오류 발생//poly.childMethod();```**실행 결과**```Parent -> ParentParent.parentMethodChild -> ChildParent.parentMethodChild.childMethodParent -> ChildParent.parentMethod```그림을 통해 코드를 하나씩 분석해보자.**부모 타입의 변수가 부모 인스턴스 참조****Parent Parent: parent.parentMethod()**부모 타입의 변수가 부모 인스턴스를 참조한다.`Parent parent = new Parent() ``Parent ` 인스턴스를 만들었다. 이 경우 부모 타입인 `Parent `를 생성했기 때문에 메모리 상에 `Parent `만 생성된다.(자식은 생성되지 않는다.)생성된 참조값을 `Parent ` 타입의 변수인 `parent `에 담아둔다.`parent.parentMethod() `를 호출하면 인스턴스의 `Parent ` 클래스에 있는 `parentMethod() `가 호출된다.**자식 타입의 변수가 자식 인스턴스 참조****Child Child: child.childMethod()**자식 타입의 변수가 자식 인스턴스를 참조한다.`Child child = new Child() ``Child ` 인스턴스를 만들었다. 이 경우 자식 타입인 `Child `를 생성했기 때문에 메모리 상에 `Child `와`Parent `가 모두 생성된다.생성된 참조값을 `Child ` 타입의 변수인 `child `에 담아둔다.`child.childMethod() `를 호출하면 인스턴스의 `Child ` 클래스에 있는 `childMethod() `가 호출된다.여기까지는 지금까지 배운 내용이므로 이해하는데 어려움은 없을 것이다. 이제부터가 중요하다.**다형적 참조: 부모 타입의 변수가 자식 인스턴스 참조****Parent Child: poly.parentMethod()**부모 타입의 변수가 자식 인스턴스를 참조한다.`Parent poly = new Child() ``Child ` 인스턴스를 만들었다. 이 경우 자식 타입인 `Child `를 생성했기 때문에 메모리 상에 `Child `와`Parent `가 모두 생성된다.생성된 참조값을 `Parent ` 타입의 변수인 `poly `에 담아둔다.**부모는 자식을 담을 수 있다.**부모 타입은 자식 타입을 담을 수 있다.`Parent poly `는 부모 타입이다. `new Child() `를 통해 생성된 결과는 `Child ` 타입이다. 자바에서 부모 타입은 자식 타입을 담을 수 있다!`Parent poly = new Child() `: 성공반대로 자식 타입은 부모 타입을 담을 수 없다.`Child child1 = new Parent() `: 컴파일 오류 발생**다형적 참조**지금까지 학습한 내용을 떠올려보면 항상 같은 타입에 참조를 대입했다. 그래서 보통 한 가지 형태만 참조할 수 있다.`Parent parent = new Parent() ``Child child = new Child() `그런데 `Parent ` 타입의 변수는 다음과 같이 자신인 `Parent `는 물론이고, 자식 타입까지 참조할 수 있다. 만약 손자가있다면 손자도 그 하위 타입도 참조할 수 있다.`Parent poly = new Parent() ``Parent poly = new Child() ``Parent poly = new Grandson() `: `Child ` 하위에 손자가 있다면 가능자바에서 부모 타입은 자신은 물론이고, 자신을 기준으로 모든 자식 타입을 참조할 수 있다. 이것이 바로 다양한 형태를참조할 수 있다고 해서 다형적 참조라 한다.

    2024.05.11 / 23pages ( 대학레포트 > 시험/강의/학업)

    태그 다형적 다형성 , 참조 부모 , 10 다형성1
  • img
  • 9 상속
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편9. 상속#1.인강/0.자바/2.자바-기본/상속 - 시작/상속 관계/상속과 메모리 구조/상속과 기능 추가/상속과 메서드 오버라이딩/상속과 접근 제어/super - 부모 참조/super - 생성자/문제와 풀이/정리상속 - 시작상속 관계가 왜 필요한지 이해하기 위해 다음 예제 코드를 만들어서 실행해보자.예제 코드**패키지 위치에 주의하자**```javapackage extends1.ex1;public class ElectricCar public void move() System.out.println(차를 이동합니다.);public void charge() System.out.println(충전합니다.);```javapackage extends1.ex1;public class GasCar public void move() System.out.println(차를 이동합니다.);public void fillUp() System.out.println(기름을 주유합니다.);```javapackage extends1.ex1;public class CarMain public static void main(String args) ElectricCar electricCar = new ElectricCar();electricCar.move();electricCar.charge();GasCar gasCar = new GasCar();gasCar.move();gasCar.fillUp();```**실행 결과**```차를 이동합니다.충전합니다.차를 이동합니다.기름을 주유합니다.``` 전기차( `ElectricCar `)와 가솔린차( `GasCar `)를 만들었다. 전기차는 이동( `move() `), 충전( `charge() `) 기능이 있고, 가솔린차는 이동( `move() `), 주유( `fillUp() `) 기능이 있다.전기차와 가솔린차는 자동차( `Car`)의 좀 더 구체적인 개념이다. 반대로 자동차( `Car`)는 전기차와 가솔린차를 포함하는추상적인 개념이다. 그래서인지 잘 보면 둘의 공통 기능이 보인다. 바로 이동( `move() `)이다.전기차든 가솔린차든 주유하는 방식이 다른 것이지 이동하는 것은 똑같다. 이런 경우 상속 관계를 사용하는 것이 효과적이다.상속 관계상속은 객체 지향 프로그래밍의 핵심 요소 중 하나로, 기존 클래스의 필드와 메서드를 새로운 클래스에서 재사용하게 해준다. 이름 그대로 기존 클래스의 속성과 기능을 그대로 물려받는 것이다. 상속을 사용하려면 `extends ` 키워드를 사용하면 된다. 그리고 `extends ` **대상은 하나만 선택**할 수 있다.**용어 정리****부모 클래스 (슈퍼 클래스)**: 상속을 통해 자신의 필드와 메서드를 다른 클래스에 제공하는 클래스**자식 클래스 (서브 클래스)**: 부모 클래스로부터 필드와 메서드를 상속받는 클래스**주의!****지금부터 코드를 작성할 때 기존 코드를 유지하기 위해, 새로운 패키지에 기존 코드를 옮겨가면서 코드를 작성할 것이다.클래스의 이름이 같기 때문에 패키지 명과 import 사용에 주의해야 한다.**상속 관계를 사용하도록 코드를 작성해보자.**기존 코드를 유지하기 위해 ex2 패키지를 새로 만들자**```javapackage extends1.ex2;public class Car public void move() System.out.println(차를 이동합니다.);````Car`는 부모 클래스가 된다. 여기에는 자동차의 공통 기능인 `move() `가 포함되어 있다.```javapackage extends1.ex2;public class ElectricCar extends Car public void charge() System.out.println(충전합니다.);```전기차는 `extends Car `를 사용해서 부모 클래스인 `Car`를 상속 받는다. 상속 덕분에 `ElectricCar `에서도`move() `를 사용할 수 있다.```javapackage extends1.ex2;public class GasCar extends Car public void fillUp() System.out.println(기름을 주유합니다.);```가솔린차도 전기차와 마찬가지로 `extends Car `를 사용해서 부모 클래스인 `Car`를 상속 받는다. 상속 덕분에 여기서도 `move() `를 사용할 수 있다.```javapackage extends1.ex2;public class CarMain public static void main(String args) ElectricCar electricCar = new ElectricCar();electricCar.move();electricCar.charge();GasCar gasCar = new GasCar();gasCar.move();gasCar.fillUp();```**실행 결과**```차를 이동합니다.충전합니다.차를 이동합니다.기름을 주유합니다.```실행 결과는 기존 예제와 완전히 동일하다.**상속 구조도**전기차와 가솔린차가 `Car`를 상속 받은 덕분에 `electricCar.move() `, `gasCar.move() `를 사용할 수 있다.참고로 당연한 이야기지만 상속은 부모의 기능을 자식이 물려 받는 것이다. 따라서 자식이 부모의 기능을 물려 받아서사용할 수 있다. 반대로 부모 클래스는 자식 클래스에 접근할 수 없다. 자식 클래스는 부모 클래스의 기능을 물려 받기때문에 접근할 수 있지만, 그 반대는 아니다. 부모 코드를 보자! 자식에 대한 정보가 하나도 없다. 반면에 자식 코드는`extends Car `를 통해서 부모를 알고 있다.단일 상속참고로 자바는 다중 상속을 지원하지 않는다. 그래서 `extend ` 대상은 하나만 선택할 수 있다. 부모를 하나만 선택할 수 있다는 뜻이다. 물론 부모가 또 다른 부모를 하나 가지는 것은 괜찮다.**다중 상속 그림**만약 비행기와 자동차를 상속 받아서 하늘을 나는 자동차를 만든다고 가정해보자. 만약 그림과 같이 다중 상속을 사용하게 되면 `AirplaneCar ` 입장에서 `move() `를 호출할 때 어떤 부모의 `move() `를 사용해야 할지 애매한 문제가 발생한다. 이것을 다이아몬드 문제라 한다. 그리고 다중 상속을 사용하면 클래스 계층 구조가 매우 복잡해지 수 있다. 이런문제점 때문에 자바는 클래스의 다중 상속을 허용하지 않는다. 대신에 이후에 설명한 인터페이스의 다중 구현을 허용해서 이러한 문제를 피한다.상속과 메모리 구조**이 부분을 제대로 이해하는 것이 앞으로 정말 중요하다!**상속 관계를 객체로 생성할 때 메모리 구조를 확인해보자.```javaElectricCar electricCar = new ElectricCar();```

    2024.05.11 / 30pages ( 대학레포트 > 시험/강의/학업)

    태그 코드 클래스 , 기능 부모 , 9 상속
  • img
  • 8 final
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편8. final#1.인강/0.자바/2.자바-기본/final 변수와 상수1/final 변수와 상수2/final 변수와 참조/정리final 변수와 상수1`final ` 키워드는 이름 그대로 끝! 이라는 뜻이다.변수에 `final ` 키워드가 붙으면 더는 값을 변경할 수 없다.참고로 `final `은 `class `, `method `를 포함한 여러 곳에 붙을 수 있다. 지금은 변수에 붙는 `final ` 키워드를 알아보자. 나머지는 `final `의 사용법은 상속을 설명한 이후에 설명한다.final - 지역 변수```javapackage final1;public class FinalLocalMain public static void main(String args) //final 지역 변수1final int data1;data1 = 10; //최초 한번만 할당 가능//data1 = 20; //컴파일 오류//final 지역 변수2final int data2 = 10;//data2 = 20; //컴파일 오류method(10);//final 매개변수static void method(final int parameter) //parameter = 20; 컴파일 오류````final `을 지역 변수에 설정할 경우 최초 한번만 할당할 수 있다. 이후에 변수의 값을 변경하려면 컴파일 오류가발생한다.`final `을 지역 변수 선언시 바로 초기화 한 경우 이미 값이 할당되었기 때문에 값을 할당할 수 없다.매개변수에 `final `이 붙으면 메서드 내부에서 매개변수의 값을 변경할 수 없다. 따라서 메서드 호출 시점에 사용된 값이 끝까지 사용된다.final - 필드(멤버 변수)```javapackage final1;//final 필드 - 생성자 초기화public class ConstructInit final int value;public ConstructInit(int value) this.value = value;````final `을 필드에 사용할 경우 해당 필드는 생성자를 통해서 한번만 초기화 될 수 있다.```javapackage final1;//final 필드 - 필드 초기화public class FieldInit static final int CONSTVALUE = 10;final int value = 10;````final ` 필드를 필드에서 초기화하면 이미 값이 설정되었기 때문에 생성자를 통해서도 초기화 할 수 없다.`value ` 필드를 참고하자.코드에서 보는 것 처럼 `static ` 변수에도 `final `을 선언할 수 있다.`CONSTVALUE `로 변수 작명 방법이 대문자를 사용했는데, 이 부분은 바로 뒤에 상수에서 설명한다.```javapackage final1;public class FinalFieldMain public static void main(String args) //final 필드 - 생성자 초기화System.out.println(생성자 초기화);ConstructInit constructInit1 = new ConstructInit(10);ConstructInit constructInit2 = new ConstructInit(20);System.out.println(constructInit1.value);System.out.println(constructInit2.value);//final 필드 - 필드 초기화System.out.println(필드 초기화);FieldInit fieldInit1 = new FieldInit();FieldInit fieldInit2 = new FieldInit();FieldInit fieldInit3 = new FieldInit();System.out.println(fieldInit1.value);System.out.println(fieldInit2.value);System.out.println(fieldInit3.value);//상수System.out.println(상수);System.out.println(FieldInit.CONSTVALUE);```**실행 결과**```생성자 초기화1020필드 초기화10상수10````ConstructInit `과 같이 생성자를 사용해서 `final ` 필드를 초기화 하는 경우, 각 인스턴스마다 `final ` 필드에 다른 값을 할당할 수 있다. 물론 `final `을 사용했기 때문에 생성 이후에 이 값을 변경하는 것은 불가능하다.

    2024.05.11 / 10pages ( 대학레포트 > 시험/강의/학업)

    태그 지역 변수 , 생성자 초기화 , 8 final
  • img
  • 7 자바 메모리 구조와 static
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편7. 자바 메모리 구조와 static#1.인강/0.자바/2.자바-기본/자바 메모리 구조/스택과 큐 자료 구조/스택 영역/스택 영역과 힙 영역/static 변수1/static 변수2/static 변수3/static 메서드1/static 메서드2/static 메서드3/문제와 풀이/정리자바 메모리 구조**자바 메모리 구조 - 비유**자바의 메모리 구조는 크게 메서드 영역, 스택 영역, 힙 영역 3개로 나눌 수 있다.**메서드 영역**: 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다.**스택 영역**: 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다.**힙 영역**: 객체(인스턴스)가 생성되는 영역이다. `new` 명령어를 사용하면 이 영역을 사용한다. 쉽게 이야기해서 붕어빵 틀로부터 생성된 붕어빵이 존재하는 공간이다. 참고로 배열도 이 영역에 생성된다.방금 설명한 내용은 쉽게 비유로 한 것이고 실제는 다음과 같다.**자바 메모리 구조 - 실제****메서드 영역(Method Area) **: 메서드 영역은 프로그램을 실행하는데 필요한 공통 데이터를 관리한다. 이 영역은프로그램의 모든 영역에서 공유한다.클래스 정보: 클래스의 실행 코드(바이트 코드), 필드, 메서드와 생성자 코드등 모든 실행 코드가 존재한다.static 영역: `static ` 변수들을 보관한다. 뒤에서 자세히 설명한다.런타임 상수 풀: 프로그램을 실행하는데 필요한 공통 리터럴 상수를 보관한다. 예를 들어서 프로그램에`hello `라는 리터럴 문자가 있으면 이런 문자를 공통으로 묶어서 관리한다. 이 외에도 프로그램을 효율적으로 관리하기 위한 상수들을 관리한다. (참고로 문자열을 다루는 문자열 풀은 자바 7부터 힙 영역으로 이동했다.)**스택 영역(Stack Area) **: 자바 실행 시, 하나의 실행 스택이 생성된다. 각 스택 프레임은 지역 변수, 중간 연산 결과, 메서드 호출 정보 등을 포함한다.스택 프레임: 스택 영역에 쌓이는 네모 박스가 하나의 스택 프레임이다. 메서드를 호출할 때 마다 하나의 스택 프레임이 쌓이고, 메서드가 종료되면 해당 스택 프레임이 제거된다.**힙 영역(Heap Area) **: 객체(인스턴스)와 배열이 생성되는 영역이다. 가비지 컬렉션(GC)이 이루어지는 주요 영역이며, 더 이상 참조되지 않는 객체는 GC에 의해 제거된다.**참고**: 스택 영역은 더 정확히는 각 쓰레드별로 하나의 실행 스택이 생성된다. 따라서 쓰레드 수 만큼 스택 영역이생성된다. 지금은 쓰레드를 1개만 사용하므로 스택 영역도 하나이다. 쓰레드에 대한 부분은 멀티 쓰레드를 학습해야 이해할 수 있다.**메서드 코드는 메서드 영역에**자바에서 특정 클래스로 100개의 인스턴스를 생성하면, 힙 메모리에 100개의 인스턴스가 생긴다. 각각의 인스턴스는내부에 변수와 메서드를 가진다. 같은 클래스로 부터 생성된 객체라도, 인스턴스 내부의 변수 값은 서로 다를 수 있지만,메서드는 공통된 코드를 공유한다. 따라서 객체가 생성될 때, 인스턴스 변수에는 메모리가 할당되지만, 메서드에 대한새로운 메모리 할당은 없다. 메서드는 메서드 영역에서 공통으로 관리되고 실행된다.정리하면 인스턴스의 메서드를 호출하면 실제로는 메서드 영역에 있는 코드를 불러서 수행한다.스택과 큐 자료 구조자바 메모리 구조 중 스택 영역에 대해 알아보기 전에 먼저 스택(Stack)이라는 자료 구조에 대해서 알아보자.스택 구조다음과 같은 1, 2, 3 이름표가 붙은 블럭이 있다고 가정하자.이 블럭을 다음과 같이 생긴 통에 넣는다고 생각해보자. 위쪽만 열려있기 때문에 위쪽으로 블럭을 넣고, 위쪽으로 블럭을 빼야 한다. 쉽게 이야기해서 넣는 곳과 빼는 곳이 같다.블럭은 1 2 3 순서대로 넣을 수 있다.이번에는 넣은 블럭을 빼자.블럭을 빼려면 위에서 부터 순서대로 빼야한다.블럭은 3 2 1 순서로 뺄 수 있다.정리하면 다음과 같다.1(넣기) 2(넣기) 3(넣기) 3(빼기) 2(빼기) 1(빼기)**후입 선출(LIFO, Last In First Out)**여기서 가장 마지막에 넣은 3번이 가장 먼저 나온다. 이렇게 나중에 넣은 것이 가장 먼저 나오는 것을 후입 선출이라 하고, 이런 자료 구조를 스택이라 한다.**선입 선출(FIFO, First In First Out)**후입 선출과 반대로 가장 먼저 넣은 것이 가장 먼저 나오는 것을 선입 선출이라 한다. 이런 자료 구조를 큐(Queue)라 한다.**큐(Queue) 자료 구조**정리하면 다음과 같다.1(넣기) 2(넣기) 3(넣기) 1(빼기) 2(빼기) 3(빼기)이런 자료 구조는 각자 필요한 영역이 있다. 예를 들어서 선착순 이벤트를 하는데 고객이 대기해야 한다면 큐 자료 구조를 사용해야 한다.이번시간에 중요한 것은 스택이다. 프로그램 실행과 메서드 호출에는 스택 구조가 적합하다. 스택 구조를 학습했으니,자바에서 스택 영역이 어떤 방식으로 작동하는지 알아보자.스택 영역다음 코드를 실행하면 스택 영역에서 어떤 변화가 있는지 확인해보자.**JavaMemoryMain1**```javapackage memory;public class JavaMemoryMain1 public static void main(String args) System.out.println(main start);method1(10);System.out.println(main end);static void method1(int m1) System.out.println(method1 start);int cal = m1 * 2;method2(cal);System.out.println(method1 end);static void method2(int m2) System.out.println(method2 start);System.out.println(method2 end);```**실행 결과**```main startmethod1 startmethod2 startmethod2 endmethod1 endmain end```**호출 그림** 처음 자바 프로그램을 실행하면 `main() `을 실행한다. 이때 `main() `을 위한 스택 프레임이 하나 생성된다.`main() ` 스택 프레임은 내부에 `args `라는 매개변수를 가진다. `args `는 뒤에서 다룬다.`main() `은 `method1() `을 호출한다. `method1() ` 스택 프레임이 생성된다.`method1() `는 `m1`, `cal` 지역 변수(매개변수 포함)를 가지므로 해당 지역 변수들이 스택 프레임에 포함된다.`method1() `은 `method2() `를 호출한다. `method2() ` 스택 프레임이 생성된다. `method2() `는 `m2` 지역 변수(매개변수 포함)를 가지므로 해당 지역 변수가 스택 프레임에 포함된다.**종료 그림**`method2() `가 종료된다. 이때 `method2() ` 스택 프레임이 제거되고, 매개변수 `m2`도 제거된다. `method2() `스택 프레임이 제거 되었으므로 프로그램은 `method1() `로 돌아간다. 물론 `method1() `을 처음부터 시작하는것이 아니라 `method1() `에서 `method2() `를 호출한 지점으로 돌아간다.`method1() `이 종료된다. 이때 `method1() ` 스택 프레임이 제거되고, 지역 변수(매개변수 포함) `m1`, `cal`도제거된다. 프로그램은 `main() `으로 돌아간다.`main() `이 종료된다. 더 이상 호출할 메서드가 없고, 스택 프레임도 완전히 비워졌다. 자바는 프로그램을 정리하고 종료한다.**정리**자바는 스택 영역을 사용해서 메서드 호출과 지역 변수(매개변수 포함)를 관리한다.메서드를 계속 호출하면 스택 프레임이 계속 쌓인다.지역 변수(매개변수 포함)는 스택 영역에서 관리한다.스택 프레임이 종료되면 지역 변수도 함께 제거된다.스택 프레임이 모두 제거되면 프로그램도 종료된다.

    2024.05.11 / 35pages ( 대학레포트 > 시험/강의/학업)

    태그 자바 스택 , 구조 메서드 , 7 자바 메모리 구
  • img
  • 6 접근 제어자
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편6. 접근 제어자#1.인강/0.자바/2.자바-기본/접근 제어자 이해1/접근 제어자 이해2/접근 제어자 종류/접근 제어자 사용 - 필드, 메서드/접근 제어자 사용 - 클래스 레벨/캡슐화/문제와 풀이/정리접근 제어자 이해1자바는 `public `, `private ` 같은 접근 제어자(access modifier)를 제공한다. 접근 제어자를 사용하면 해당 클래스외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.이런 접근 제어자가 왜 필요할까? 예제를 통해 접근 제어자가 필요한 이유를 알아보자.여러분은 스피커에 들어가는 소프트웨어를 개발하는 개발자다.스피커의 음량은 절대로 100을 넘으면 안된다는 요구사항이 있다. (**100을 넘어가면 스피커의 부품들이 고장난다.**)스피커 객체를 만들어보자.스피커는 음량을 높이고, 내리고, 현재 음량을 확인할 수 있는 단순한 기능을 제공한다.요구사항 대로 스피커의 음량은 100까지만 증가할 수 있다. 절대 100을 넘어가면 안된다.**Speaker**```javapackage access;public class Speaker int volume;Speaker(int volume) this.volume = volume;void volumeUp() if (volume >= 100) System.out.println(음량을 증가할 수 없습니다. 최대 음량입니다.); else volume += 10;System.out.println(음량을 10 증가합니다.);void volumeDown() volume -= 10;System.out.println(volumeDown 호출);void showVolume() System.out.println(현재 음량: + volume);```생성자를 통해 초기 음량 값을 지정할 수 있다.`volumeUp() ` 메서드를 보자. 음량을 한번에 10씩 증가한다. 단 음량이 100을 넘게되면 더는 음량을 증가하지 않는다.**SpeakerMain**```javapackage access;public class SpeakerMain public static void main(String args) Speaker speaker = new Speaker(90);speaker.showVolume();speaker.volumeUp();speaker.showVolume();speaker.volumeUp();speaker.showVolume();```**실행 결과**```현재 음량: 90음량을 10 증가합니다.현재 음량: 100음량을 증가할 수 없습니다. 최대 음량입니다.현재 음량: 100```초기 음량 값을 90으로 지정했다. 그리고 음량을 높이는 메서드를 여러번 호출했다.기대한 대로 음량은 100을 넘지 않았다. 프로젝트는 성공적으로 끝났다.오랜 시간이 흘러서 업그레이드 된 다음 버전의 스피커를 출시하게 되었다. 이때는 새로운 개발자가 급하게 기존 코드를이어받아서 개발을 하게 되었다. 참고로 새로운 개발자는 기존 요구사항을 잘 몰랐다. 코드를 실행해보니 이상하게 음량이 100이상 올라가지 않았다. 소리를 더 올리면 좋겠다고 생각한 개발자는 다양한 방면으로 고민했다.`Speaker ` 클래스를 보니 `volume ` 필드를 직접 사용할 수 있었다. `volume ` 필드의 값을 200으로 설정하고 이 코드를 실행한 순간 스피커의 부품들에 과부하가 걸리면서 폭발했다.**SpeakerMain - 필드 직접 접근 코드 추가**```javapackage access;public class SpeakerMain public static void main(String args) Speaker speaker = new Speaker(90);speaker.showVolume();speaker.volumeUp();speaker.showVolume();speaker.volumeUp();speaker.showVolume();//필드에 직접 접근System.out.println(volume 필드 직접 접근 수정);speaker.volume = 200;speaker.showVolume();```**실행 결과**```현재 음량: 90음량을 10 증가합니다.현재 음량: 100음량을 증가할 수 없습니다. 최대 음량입니다.현재 음량: 100volume 필드 직접 접근 수정현재 음량: 200```**volume 필드**`Speaker ` 객체를 사용하는 사용자는 `Speaker `의 `volume ` 필드와 메서드에 모두 접근할 수 있다.앞서 `volumeUp() `과 같은 메서드를 만들어서 음량이 100을 넘지 못하도록 기능을 개발했지만 소용이 없다. 왜냐하면 `Speaker `를 사용하는 입장에서는 `volume ` 필드에 직접 접근해서 원하는 값을 설정할 수 있기 때문이다.이런 문제를 근본적으로 해결하기 위해서는 `volume ` 필드의 외부 접근을 막을 수 있는 방법이 필요하다.접근 제어자 이해2이 문제를 근본적으로 해결하는 방법은 `volume ` 필드를 `Speaker ` 클래스 외부에서는 접근하지 못하게 막는 것이다.**Speaker - volume 접근 제어자를 private으로 수정**```javapackage access;public class Speaker private int volume; //private 사용.````private ` 접근 제어자는 모든 외부 호출을 막는다. 따라서 `private `이 붙은 경우 해당 클래스 내부에서만 호출할 수 있다.**volume 필드 - private 변경 후**그림을 보면 `volume ` 필드를 `private `을 사용해서 `Speaker ` 내부에 숨겼다.외부에서 `volume ` 필드에 직접 접근할 수 없게 막은 것이다. `volume ` 필드는 이제 `Speaker ` 내부에서만 접근할 수있다.이제 `SpeakerMain ` 코드를 다시 실행해보자.```java//필드에 직접 접근System.out.println(volume 필드 직접 접근 수정);speaker.volume = 200; //private 접근 오류```IDE에서 `speaker.volume = 200 ` 부분에 오류가 발생하는 것을 확인할 수 있다. 실행해보면 다음과 같은 컴파일오류가 발생한다.컴파일 오류 메시지```volume has private access in access.Speaker````volume ` 필드는 `private `으로 설정되어 있기 때문에 외부에서 접근할 수 없다는 오류이다.**volume 필드 직접 접근 - 주석 처리**```java//필드에 직접 접근System.out.println(volume 필드 직접 접근 수정);//speaker.volume = 200; //private 접근 오류speaker.showVolume();```이제 `Speaker ` 외부에서 `volume ` 필드에 직접 접근하는 것은 불가능하다. 이 경우 자바 컴파일러가 컴파일 오류를발생시킨다.프로그램을 실행하기 위해서 `volume ` 필드에 직접 접근하는 코드를 주석 처리하자.

    2024.05.11 / 20pages ( 대학레포트 > 시험/강의/학업)

    태그 메서드 접근 , 직접 제어자 , 6 접근 제어자
  • img
  • 5 패키지
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편5. 패키지#1.인강/0.자바/2.자바-기본/패키지 - 시작/패키지 - import /패키지 규칙/패키지 활용/정리패키지 - 시작여러분이 쇼핑몰 시스템을 개발한다고 가정해보자. 다음과 같이 프로그램이 매우 작고 단순해서 클래스가 몇게 없다면크게 고민할 거리가 없겠지만, 기능이 점점 추가되어서 프로그램이 아주 커지게 된다면 어떻게 될까?**아주 작은 프로그램**```OrderUserProduct```**큰 프로그램**```UserUserManagerUserHistoryProductProductCatalogProductImageOrderOrderServiceOrderHistoryShoppingCartCartItemPaymentPaymentHistoryShipmentShipmentTracker```매우 많은 클래스가 등장하면서 관련 있는 기능들을 분류해서 관리하고 싶을 것이다.컴퓨터는 보통 파일을 분류하기 위해 폴더, 디렉토리라는 개념을 제공한다. 자바도 이런 개념을 제공하는데, 이것이 바로 패키지이다.다음과 같이 카테고리를 만들고 분류해보자.```* user* User* UserManager* UserHistory* product* Product* ProductCatalog* ProductImage* order* Order* OrderService* OrderHistory* cart* ShoppingCart* CartItem* payment* Payment* PaymentHistory* shipping* Shipment* ShipmentTracker```여기서 `user `, `product `등이 바로 패키지이다. 그리고 해당 패키지 안에 관련된 자바 클래스들을 넣으면 된다.패키지(package)는 이름 그대로 물건을 운송하기 위한 포장 용기나 그 포장 묶음을 뜻한다.패키지 사용패키지 사용법을 코드로 확인해보자.패키지를 먼저 만들고 그 다음에 클래스를 만들어야 한다.**패키지 위치에 주의하자.****pack.Data **```javapackage pack;public class Data public Data() System.out.println(패키지 pack Data 생성);```**패키지를 사용하는 경우 항상 코드 첫줄에 `package pack `과 같이 패키지 이름을 적어주어야 한다.**여기서는 `pack ` 패키지에 `Data ` 클래스를 만들었다.이후에 `Data ` 인스턴스가 생성되면 생성자를 통해 정보를 출력한다.**pack.a.User **```javapackage pack.a;public class User public User() System.out.println(패키지 pack.a 회원 생성);````pack ` 하위에 `a`라는 패키지를 먼저 만들자.`pack.a ` 패키지에 `User ` 클래스를 만들었다.이후에 `User ` 인스턴스가 생성되면 생성자를 통해 정보를 출력한다.**참고**: 생성자에 `public `을 사용했다. 다른 패키지에서 이 클래스의 생성자를 호출하려면 `public `을 사용해야 한다.자세한 내용은 접근 제어자에서 설명한다. 지금은 코드와 같이 생성자에 `public ` 키워드를 넣어두자.**pack.PackageMain1**```javapackage pack;public class PackageMain1 public static void main(String args) Data data = new Data();pack.a.User user = new pack.a.User();````pack ` 패키지 위치에 `PackageMain1 ` 클래스를 만들었다.**실행 결과**```패키지 pack Data 생성패키지 pack.a 회원 생성```**사용자와 같은 위치:** `PackageMain1 `과 `Data `는 같은 `pack `이라는 패키지에 소속되어 있다. 이렇게 같은 패키지에 있는 경우에는 패키지 경로를 생략해도 된다.**사용자와 다른 위치:** `PackageMain1 `과 `User `는 서로 다른 패키지다. 이렇게 패키지가 다르면`pack.a.User `와 같이 패키지 전체 경로를 포함해서 클래스를 적어주어야 한다.패키지 - importimport이전에 본 코드와 같이 패키지가 다르다고 `pack.a.User `와 같이 항상 전체 경로를 적어주는 것은 불편하다. 이때는`import `를 사용하면 된다.```javapackage pack;import pack.a.User;public class PackageMain2 public static void main(String args) Data data = new Data();User user = new User(); //import 사용으로 패키지 명 생략 가능```**실행 결과**```패키지 pack Data 생성패키지 pack.a 회원 생성```코드에서 첫줄에는 `package `를 사용하고, 다음 줄에는 `import `를 사용할 수 있다.`import `를 사용하면 다른 패키지에 있는 클래스를 가져와서 사용할 수 있다.`import `를 사용한 덕분에 코드에서는 패키지 명을 생략하고 클래스 이름만 적을 수 있다.참고로 특정 패키지에 포함된 모든 클래스를 포함해서 사용하고 싶으면 `import ` 시점에 `*(별)`을 사용하면 된다.**패키지 별(*) 사용**```javapackage pack;

    2024.05.11 / 9pages ( 대학레포트 > 시험/강의/학업)

    태그 사용 패키지 , 생성자 클래스 , 5 패키지
  • img
  • 4 생성자
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편4. 생성자#1.인강/0.자바/2.자바-기본/생성자 - 필요한 이유/this/생성자 - 도입/기본 생성자/생성자 - 오버로딩과 this()/문제와 풀이/정리생성자 - 필요한 이유객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(Constructor)를 이용하면 된다.생성자를 알아보기 전에 먼저 생성자가 왜 필요한지 코드로 간단히 알아보자.**MemberInit**```javapackage construct;public class MemberInit String name;int age;int grade;```**MethodInitMain1**```javapackage construct;public class MethodInitMain1 public static void main(String args) MemberInit member1 = new MemberInit();member1.name = user1;member1.age = 15;member1.grade = 90;MemberInit member2 = new MemberInit();member2.name = user2;member2.age = 16;member2.grade = 80;MemberInit members = member1, member2;for (MemberInit s : members) System.out.println(이름: + s.name + 나이: + s.age + 성적: +s.grade);```**실행 결과**```이름:user1 나이:15 성적:90이름:user2 나이:16 성적:80```회원 객체를 생성하고 나면 `name `, `age`, `grade ` 같은 변수에 초기값을 설정한다. 아마도 회원 객체를 제대로 사용하기 위해서는 객체를 생성하자 마자 이런 초기값을 설정해야 할 것이다. 이 코드에는 회원의 초기값을 설정하는 부분이계속 반복된다. 메서드를 사용해서 반복을 제거해보자.```javapackage construct;public class MethodInitMain2 public static void main(String args) MemberInit member1 = new MemberInit();initMember(member1, user1, 15, 90);MemberInit member2 = new MemberInit();initMember(member2, user2, 16, 80);MemberInit members = member1, member2;for (MemberInit s : members) System.out.println(이름: + s.name + 나이: + s.age + 성적: +s.grade);static void initMember(MemberInit member, String name, int age, int grade) member.name = name;member.age = age;member.grade = grade;````initMember(.) ` 메서드를 사용해서 반복을 제거했다. 그런데 이 메서드는 대부분 `MemberInit ` 객체의 멤버 변수를 사용한다. 우리는 앞서 객체 지향에 대해서 학습했다. 이런 경우 속성과 기능을 한 곳에 두는 것이 더 나은 방법이다. 쉽게 이야기해서 `MemberInit `이 자기 자신의 데이터를 변경하는 기능(메서드)을 제공하는 것이 좋다.this**MemberInit - initMember() 추가**```javapackage construct;public class MemberInit String name;int age;int grade;//추가void initMember(String name, int age, int grade) this.name = name;this.age = age;this.grade = grade;```javapackage construct;public class MethodInitMain3 public static void main(String args) MemberInit member1 = new MemberInit();member1.initMember(user1, 15, 90);MemberInit member2 = new MemberInit();member2.initMember(user2, 16, 80);MemberInit members = member1, member2;for (MemberInit s : members) System.out.println(이름: + s.name + 나이: + s.age + 성적: +s.grade);````initMember(.) `는 `Member `에 초기값 설정 기능을 제공하는 메서드이다.다음과 같이 메서드를 호출하면 객체의 멤버 변수에 인자로 넘어온 값을 채운다.`member1.initMember(user1, 15, 90) `this`Member `의 코드를 다시 보자`initMember(String name.) `의 코드를 보면 메서드의 매개변수에 정의한 `String name `과 `Member `의 멤버 변수의 이름이 `String name `으로 둘다 똑같다. 나머지 변수 이름도 `name `, `age`, `grade `로 모두 같다.멤버 변수와 메서드의 매개변수의 이름이 같으면 둘을 어떻게 구분해야 할까?이 경우 멤버 변수보다 매개변수가 코드 블럭의 더 안쪽에 있기 때문에 **매개변수가 우선순위**를 가진다. 따라서`initMember(String name,.) ` 메서드 안에서 `name `이라고 적으면 매개변수에 접근하게 된다.멤버 변수에 접근하려면 앞에 `this. `이라고 해주면 된다. 여기서 `this `는 인스턴스 자신의 참조값을 가리킨다.

    2024.05.11 / 18pages ( 대학레포트 > 시험/강의/학업)

    태그 멤버 생성자 , 변수 메서드 , 4 생성자
  • img
  • 3 객체 지향 프로그래밍
  • 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편 김영한의 실전 자바 기본편3. 객체 지향 프로그래밍#1.인강/0.자바/2.자바-기본/절차 지향 프로그래밍1 - 시작/절차 지향 프로그래밍2 - 데이터 묶음/절차 지향 프로그래밍3 - 메서드 추출/클래스와 메서드/객체 지향 프로그래밍/문제와 풀이/정리절차 지향 프로그래밍1 - 시작**절차 지향 프로그래밍 vs 객체 지향 프로그래밍**프로그래밍 방식은 크게 절차 지향 프로그래밍과 객체 지향 프로그래밍으로 나눌 수 있다.**절차 지향 프로그래밍**절차 지향 프로그래밍은 이름 그대로 절차를 지향한다. 쉽게 이야기해서 실행 순서를 중요하게 생각하는 방식이다.절차 지향 프로그래밍은 프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다. 즉, 어떻게를 중심으로 프로그래밍 한다.**객체 지향 프로그래밍**객체 지향 프로그래밍은 이름 그대로 객체를 지향한다. 쉽게 이야기해서 객체를 중요하게 생각하는 방식이다.객체 지향 프로그래밍은 실제 세계의 사물이나 사건을 객체로 보고, 이러한 객체들 간의 상호작용을 중심으로 프로그래밍하는 방식이다. 즉, 무엇을 중심으로 프로그래밍 한다.**둘의 중요한 차이**절차 지향은 데이터와 해당 데이터에 대한 처리 방식이 분리되어 있다. 반면 객체 지향에서는 데이터와 그 데이터에 대한 행동(메서드)이 하나의 객체 안에 함께 포함되어 있다.우리는 지금까지 클래스와 객체를 사용해서 관련 데이터를 묶어서 사용하는 방법을 학습했다.그럼 앞서 배운 것 처럼 단순히 객체를 사용하기만 하면 객체 지향 프로그래밍이라 할 수 있을까?사실 **지금까지 우리가 작성한 모든 프로그램은 절차 지향 프로그램**이다.그렇다면 무엇이 객체 지향 프로그래밍이란 말인가?절차 지향에서 객체 지향으로 점진적으로 코드를 변경해보면서 객체 지향 프로그래밍을 이해해보자.문제: 음악 플레이어 만들기음악 플레이어를 만들어보자.**요구 사항:**1. 음악 플레이어를 켜고 끌 수 있어야 한다.2. 음악 프레이어의 볼륨을 증가, 감소할 수 있어야 한다.3. 음악 플레이어의 상태를 확인할 수 있어야 한다.**예시 출력:**```음악 플레이어를 시작합니다음악 플레이어 볼륨:1음악 플레이어 볼륨:2음악 플레이어 볼륨:1음악 플레이어 상태 확인음악 플레이어 ON, 볼륨:1음악 플레이어를 종료합니다```절차 지향 음악 플레이어1```javapackage oop1;public class MusicPlayerMain1 public static void main(String args) int volume = 0;boolean isOn = false;//음악 플레이어 켜기isOn = true;System.out.println(음악 플레이어를 시작합니다);//볼륨 증가volume++;System.out.println(음악 플레이어 볼륨: + volume);//볼륨 증가volume++;System.out.println(음악 플레이어 볼륨: + volume);//볼륨 감소volume;System.out.println(음악 플레이어 볼륨: + volume);//음악 플레이어 상태System.out.println(음악 플레이어 상태 확인);if (isOn) System.out.println(음악 플레이어 ON, 볼륨: + volume); else System.out.println(음악 플레이어 OFF);//음악 플레이어 끄기isOn = false;System.out.println(음악 플레이어를 종료합니다);```**실행 결과**```음악 플레이어를 시작합니다음악 플레이어 볼륨:1음악 플레이어 볼륨:2음악 플레이어 볼륨:1음악 플레이어 상태 확인음악 플레이어 ON, 볼륨:1음악 플레이어를 종료합니다```순서대로 프로그램이 작동하도록 단순하게 작성했다. 이 코드를 점진적으로 변경해보자.절차 지향 프로그래밍2 - 데이터 묶음앞서 작성한 코드에 클래스를 도입하자. `MusicPlayerData `라는 클래스를 만들고, 음악 플레이어에 사용되는 데이터들을 여기에 묶어서 멤버 변수로 사용하자.절차 지향 음악 플레이어2 - 데이터 묶음```javapackage oop1;public class MusicPlayerData int volume = 0;boolean isOn = false;```음악 플레이어에 사용되는 `volume `, `isOn ` 속성을 `MusicPlayerData `의 멤버 변수에 포함했다.```javapackage oop1;/*** 음악 플레이어와 관련된 데이터 묶기*/public class MusicPlayerMain2 public static void main(String args) MusicPlayerData data = new MusicPlayerData();//음악 플레이어 켜기data.isOn = true;System.out.println(음악 플레이어를 시작합니다);//볼륨 증가data.volume++;System.out.println(음악 플레이어 볼륨: + data.volume);//볼륨 증가data.volume++;System.out.println(음악 플레이어 볼륨: + data.volume);//볼륨 감소data.volume;System.out.println(음악 플레이어 볼륨: + data.volume);//음악 플레이어 상태System.out.println(음악 플레이어 상태 확인);if (data.isOn) System.out.println(음악 플레이어 ON, 볼륨: + data.volume); else System.out.println(음악 플레이어 OFF);//음악 플레이어 끄기data.isOn = false;System.out.println(음악 플레이어를 종료합니다);```음악 플레이어와 관련된 데이터는 `MusicPlayerData ` 클래스에 존재한다. 이제 이 클래스를 사용하도록 기존 로직을변경했다. 이후에 프로그램 로직이 더 복잡해져서 다양한 변수들이 추가되더라도 음악 플레이어와 관련된 변수들은`MusicPlayerData data ` 객체에 속해있으므로 쉽게 구분할 수 있다.절차 지향 프로그래밍3 - 메서드 추출코드를 보면 다음과 같이 중복되는 부분들이 있다.```java//볼륨 증가data.volume++;System.out.println(음악 플레이어 볼륨: + data.volume);//볼륨 증가data.volume++;System.out.println(음악 플레이어 볼륨: + data.volume);```그리고 각각의 기능들은 이후에 재사용 될 가능성이 높다.음악 플레이어 켜기, 끄기볼륨 증가, 감소음악 플레이어 상태 출력메서드를 사용해서 각각의 기능을 구분해보자.절차 지향 음악 플레이어3 - 메서드 추출```javapackage oop1;/*** 메서드 추출

    2024.05.11 / 19pages ( 대학레포트 > 시험/강의/학업)

    태그 볼륨 지향 , 객체 플레이어 , 3 객체 지향 프로
  • img
  • 1 Hello World
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문1. Hello World#1.인강/0.자바/1.자바-입문/개발 환경 설정/다운로드 소스 코드 실행 방법/자바 프로그램 실행/주석(comment)/자바란?개발 환경 설정**IDE - 인텔리제이 vs 이클립스**자바 프로그램을 개발할 때는 인텔리제이(IntelliJ) 또는 이클립스(Eclipse)라는 툴을 많이 사용한다. 과거에는 이클립스를 많이 사용했지만 최근에는 빠른 속도와 사용의 편의성 때문에 인텔리제이를 주로 사용한다.자바로 개발하는 대부분의 메이저 회사들도 최근에는 인텔리제이를 주로 사용하므로 우리도 인텔리제이로 학습**OS - 윈도우 vs Mac**자바로 개발하는 대부분의 메이저 회사들은 Mac 사용윈도우를 사용해도 무방함강의는 Mac을 사용하지만 윈도우 사용자들을 최대한 배려해서 진행윈도우 화면 스크린샷, 윈도우용 단축키**참고: 자바를 별도로 설치하지 않아도 됩니다. 인텔리제이 안에서 자바 설치도 함께 진행합니다.**인텔리제이(IntelliJ) 설치하기다운로드 링크: https://www.jetbrains.com/ko-kr/idea/download**IntelliJ IDEA Community Edition (무료 버전)**OS 선택: Windows, macOs, LinuxWindows: `.exe ` 선택macOs: M1, M2: A pple Silicon 선택, 나머지: Intel 선택**참고**: 인텔리제이는 무료 버전인 Community Edition과 유료 버전인 IntelliJ IDEA Ultimate가 있습니다. 제가진행하는 모든 강의는 무료 버전인 Community Edition으로 충분합니다. 특히 자바 언어를 학습하는 단계에서는 유로 버전과 무료 버전의 차이가 없습니다.인텔리제이 실행하기**New Project**New Project를 선택해서 새로운 프로젝트를 만들자**New Project 화면**Name: java-startLocation: 프로젝트 위치, 임의 선택Create Git repository 선택하지 않음Language: JavaBuild system: IntelliJJDK: 자바 버전 17 이상`Add sample code ` 선택**JDK 다운로드 화면 이동 방법**자바로 개발하기 위해서는 JDK가 필요하다. JDK는 자바 프로그래머를 위한 도구 + 자바 실행 프로그램의 묶음이다.**JDK 다운로드 화면**Version: 21을 선택하자.Vendor: Oracle OpenJDK를 선택하자. 다른 것을 선택해도 된다.aarch64: 애플 M1, M2, M3 CPU 사용시 선택, 나머지는 뒤에 이런 코드가 붙지 않은 JDK를 선택하면 된다.Location: JDK 설치 위치, 기본값을 사용하자.**주의 - 변경 사항****Oracle OpenJDK 21 버전이 목록에 없다면 Eclipse Temurin 21을 선택하면 된다.**`Download ` 버튼을 통해서 다운로드 JDK를 다운로드 받는다.다운로드가 완료 되고 이전 화면으로 돌아가면 `Create ` 버튼 선택하자. 그러면 다음 IntelliJ 메인 화면으로 넘어간다.**IntelliJ 메인 화면**앞서 `Add sample code ` 선택해서 샘플 코드가 만들어져 있다.위쪽에 빨간색으로 강조한 초록색 화살표 버튼을 선택하고 `Run Main.main() ` 버튼을 선택하면 프로그램이실행된다.윈도우 사용자 추가 설명서윈도우 사용자도 Mac용 IntelliJ와 대부분 같은 화면이다. 일부 다른 화면 위주로 설명하겠다.프로그램 시작 화면New Project 선택

    2024.05.11 / 22pages ( 대학레포트 > 시험/강의/학업)

    태그 버전 자바 , 인텔리 화면 , 1 Hello Wo
  • img
  • 10 다음으로
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문10. 다음으로#1.인강/0.자바/1.자바-입문학습 내용 정리전체 목차1. Hello World/개발 환경 설정/다운로드 소스 코드 실행 방법/자바 프로그램 실행/주석(comment)/자바란?2. 변수/변수 시작/변수 값 변경/변수 선언과 초기화/변수 타입1/변수 타입2/변수 명명 규칙/문제와 풀이/정리3. 연산자/산술 연산자/문자열 더하기/연산자 우선순위/증감 연산자/비교 연산자/논리 연산자/대입 연산자/문제와 풀이/정리4. 조건문/if문1 - if, else/if문2 - else if/if문3 - if문과 else if문/switch문/삼항 연산자/문제와 풀이1/문제와 풀이2/정리5. 반복문/반복문 시작/while문1/while문2/do-while문/break, continue /for문1/for문2/중첩 반복문/문제와 풀이1/문제와 풀이2/정리6. 스코프, 형변환/스코프1 - 지역 변수와 스코프/스코프2 - 스코프 존재 이유/형변환1 - 자동 형변환/형변환2 - 명시적 형변환/계산과 형변환/정리7. 훈련/Scanner 학습/Scanner - 기본 예제/Scanner - 반복 예제/문제와 풀이1/문제와 풀이2/문제와 풀이3/문제와 풀이4/정리8. 배열/배열 시작/배열의 선언과 생성/배열 사용/배열 리펙토링/2차원 배열 - 시작/2차원 배열 - 리펙토링1/2차원 배열 - 리펙토링2/향상된 for문/문제와 풀이1/문제와 풀이2/문제와 풀이3/정리9. 메서드/메서드 시작/메서드 사용/메서드 정의/반환 타입

    2024.05.11 / 6pages ( 대학레포트 > 시험/강의/학업)

    태그 연산자 변수 , 정리 배열 , 10 다음으로
  • img
  • 9 메서드
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문9. 메서드#1.인강/0.자바/1.자바-입문/메서드 시작/메서드 사용/메서드 정의/반환 타입/메서드 호출과 값 전달1/메서드 호출과 값 전달2/메서드와 형변환/메서드 오버로딩/문제와 풀이1/문제와 풀이2/정리메서드 시작두 숫자를 입력 받아서 더하고 출력하는 단순한 기능을 개발해보자.먼저 `1 + 2 `를 수행하고, 그 다음으로 `10 + 20 `을 수행할 것이다.**Method1**```javapackage method;public class Method1 public static void main(String args) //계산1int a = 1;int b = 2;System.out.println(a + + + b + 연산 수행);int sum1 = a + b;System.out.println(결과1 출력: + sum1);//계산2int x = 10;int y = 20;System.out.println(x + + + y + 연산 수행);int sum2 = x + y;System.out.println(결과2 출력: + sum2);```같은 연산을 두 번 수행한다.코드를 잘 보면 계산1 부분과, 계산2 부분이 거의 같다.**계산1**```javaint a = 1;int b = 2;System.out.println(a + + + b + 연산 수행);int sum1 = a + b;```**계산2**```javaint x = 10;int y = 20;System.out.println(x + + + y + 연산 수행);int sum2 = x + y;```계산1, 계산2 둘 다 변수를 두 개 선언하고, 어떤 연산을 수행하는지 출력하고, 두 변수를 더해서 결과를 구한다.만약 프로그램의 여러 곳에서 이와 같은 계산을 반복해야 한다면? 같은 코드를 여러번 반복해서 작성해야 할 것이다.더 나아가서 어떤 연산을 수행하는지 출력하는 부분을 변경하거나 또는 제거하고 싶다면 해당 코드를 다 찾아다니면서모두 수정해야 할 것이다.이런 문제를 어떻게 깔끔하게 해결할 수 있을까?잠깐 아주 간단하게 수학의 함수를 알아보자.**함수(function)** 수학 용어가 나왔다고 전혀 어렵게 생각할 것이 없다! 숫자를 2개 입력하면 해당 숫자를 더한 다음에 그 결과를 출력하는 아주 단순한 함수이다. 이 함수의 이름은 `add`이다.**함수 정의**`add(a, b) = a + b `이름이 `add`이고 `a`, `b`라는 두 값을 받는 함수이다. 그리고 이 함수는 `a + b ` 연산을 수행한다.**함수 사용**```add(1,2) -> 결과:3add(5,6) -> 결과:11add(3,5) -> 결과:8```함수에 값을 입력하면, 함수가 가진 연산을 처리한 다음 결과를 출력한다. 여기서는 단순히 `a+b`라는 연산을 수행한다.여러번 같은 계산을 해야 한다면 지금처럼 함수를 만들어두고(정의), 필요한 입력 값을 넣어서 해당 함수를 호출하면 된다. 그러면 계산된 결과가 나온다.함수는 마치 블랙박스와 같다. 함수를 호출할 때는 외부에서는 필요한 값만 입력하면 된다. 그러면 계산된 결과가출력된다.같은 함수를 다른 입력 값으로 여러번 호출할 수 있다.여기서 핵심은 함수를 한번 정의해두면 계속해서 재사용할 수 있다는 점이다!**평균 함수**만약 두 수의 평균을 구해야 한다면 매번 (a + b) / 2라는 공식을 사용해야 할 것이다.이것을 함수로 만들어두면 다음과 같이 사용하면 된다.**함수 정의**`avg(a, b) = (a + b) / 2 `**함수 사용**```avg(4,6) -> 결과:5avg(10,20) -> 결과:15avg(100,200) -> 결과:150```수학의 함수의 개념을 프로그래밍에 가지고 온다면 어떨까? 필요한 기능을 미리 정의해두고 필요할 때 마다 호출해서사용할 수 있기 때문에 앞서 고민한 문제들을 해결할 수 있을 것 같다.프로그램 언어들은 오래 전 부터 이런 문제를 해결하기 위해 수학의 함수라는 개념을 차용해서 사용한다.메서드 사용자바에서는 함수를 메서드(Method)라 한다.메서드도 함수의 한 종류라고 생각하면 된다. 지금은 둘을 구분하지 않고, 이정도만 알아두자.메서드를 사용하면 앞서 고민한 문제를 한번에 해결할 수 있다.메서드에 대한 자세한 설명보다는 우선 메서드를 사용해서 코드를 작성해보자. 참고로 앞에서 작성한 코드와 완전히 동일하게 작동하는 코드이다.**Method1Ref**```javapackage method;public class Method1Ref public static void main(String args) int sum1 = add(5, 10);System.out.println(결과1 출력: + sum1);int sum2 = add(15, 20);System.out.println(결과2 출력: + sum2);//add 메서드public static int add(int a, int b) System.out.println(a + + + b + 연산 수행);int sum = a + b;return sum;```**실행 결과**```5+10 연산 수행결과1 출력:1515+20 연산 수행결과2 출력:35```중복이 제거되고, 코드가 상당히 깔끔해진 것을 느낄 수 있을 것이다.**메서드 정의**```javapublic static int add(int a, int b) System.out.println(a + + + b + 연산 수행);int sum = a + b;return sum;```이 부분이 바로 메서드이다. 이것을 함수를 정의하는 것과 같이, 메서드를 정의한다고 표현한다.메서드는 수학의 함수와 유사하게 생겼다. 함수에 값을 입력하면, 어떤 연산을 처리한 다음에 결과를 반환한다.(수학에 너무 집중하지는 말자, 단순히 무언가 정의해두고 필요할 때 불러서 사용한다는 개념으로 이해하면 충분하다)메서드는 크게 **메서드 선언**과 **메서드 본문**으로 나눌 수 있다.**메서드 선언(Method Declaration)**`public static int add(int a, int b) `메서드의 선언 부분으로, 메서드 이름, 반환 타입, 매개변수(파라미터) 목록을 포함한다.이름 그대로 이런 메서드가 있다고 선언하는 것이다. 메서드 선언 정보를 통해 다른 곳에서 해당 메서드를 호출할 수 있다.`public static ``public `: 다른 클래스에서 호출할 수 있는 메서드라는 뜻이다. 접근 제어에서 학습한다.`static `: 객체를 생성하지 않고 호출할 수 있는 정적 메서드라는 뜻이다. 자세한 내용은 뒤에서 다룬다.두 키워드의 자세한 내용은 뒤에서 다룬다. 지금은 단순하게 메서드를 만들 때 둘을 사용해야 한다고 생각하자.`int add(int a, int b) ``int`: 반환 타입을 정의한다. 메서드의 실행 결과를 반환할 때 사용할 반환 타입을 지정한다.`add`: 메서드에 이름을 부여한다. 이 이름으로 메서드를 호출할 수 있다.`(int a, int b) `: 메서드를 호출할 때 전달하는 입력 값을 정의한다. 이 변수들은 해당 메서드 안에서만 사용된다. 이렇게 메서드 선언에 사용되는 변수를 영어로 파라미터(parameter), 한글로 매개변수라 한다.**메서드 본문(Method Body)**```javaSystem.out.println(a + + + b + 연산 수행);int sum = a + b;return sum;```메서드가 수행해야 하는 코드 블록이다.메서드를 호출하면 메서드 본문이 순서대로 실행된다.메서드 본문은 블랙박스이다. **메서드를 호출하는 곳에서는 메서드 선언은 알지만 메서드 본문은 모른다.**메서드의 실행 결과를 반환하려면 `return `문을 사용해야 한다. `return `문 다음에 반환할 결과를 적어주면 된다.`return sum `: `sum` 변수에 들어있는 값을 반환한다.**메서드 호출**앞서 정의한 메서드를 호출해서 실행하려면 메서드 이름에 입력 값을 전달하면 된다. 보통 메서드를 호출한다고 표현한다.```javaint sum1 = add(5, 10);int sum2 = add(15, 20);```**메서드를 호출하면 어떻게 실행되는지 순서대로 확인해보자**```javaint sum1 = add(5, 10); //add라는 메서드를 숫자 5,10을 전달하면서 호출한다.int sum1 = 15; //add(5, 10)이 실행된다. 실행 결과는 반환 값은 15이다.//sum1에 15 값이 저장된다.```메서드를 호출하면 메서드는 계산을 끝내고 결과를 반환한다. 쉽게 이야기하자면, 메서드 호출이 끝나면 해당 메서드가반환한 결과 값으로 치환된다.**조금 더 자세히 알아보자.** 메서드의 코드는 일부 축약했다.```java//1: 메서드 호출int sum1 = add(5, 10);//2: 파라미터 변수 a=5, b=10이 전달되면서 메서드가 수행된다.public static int add(int a=5, int b=10) int sum = a + b;return sum;//3: 메서드가 수행된다.public static int add(int a=5, int b=10) int sum = a(5) + b(10);return sum;//4: return을 사용해서 메서드 실행의 결과인 sum을 반환한다. sum에는 값 15가 들어있으므로 값 15가반환된다.public static int add(int a=5, int b=10) int sum = 15;return sum(15);//5: 메서드 호출 결과로 메서드에서 반환한 값 15가 나온다. 이 값을 sum1에 대입했다.int sum1 = 15;```메서드 호

    2024.05.11 / 32pages ( 대학레포트 > 시험/강의/학업)

    태그 연산 메서드 , 결과 함수 , 9 메서드
  • img
  • 8 배열
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문8. 배열#1.인강/0.자바/1.자바-입문/배열 시작/배열의 선언과 생성/배열 사용/배열 리펙토링/2차원 배열 - 시작/2차원 배열 - 리펙토링1/2차원 배열 - 리펙토링2/향상된 for문/문제와 풀이1/문제와 풀이2/문제와 풀이3/정리배열 시작배열이 필요한 이유학생의 점수를 출력하는 간단한 프로그램을 작성해보자.**Array1 **```javapackage array;public class Array1 public static void main(String args) int student1 = 90;int student2 = 80;int student3 = 70;int student4 = 60;int student5 = 50;System.out.println(학생1 점수: + student1);System.out.println(학생2 점수: + student2);System.out.println(학생3 점수: + student3);System.out.println(학생4 점수: + student4);System.out.println(학생5 점수: + student5);```**실행 결과**```학생1 점수: 90학생2 점수: 80학생3 점수: 70학생4 점수: 50학생5 점수: 90```학생을 몇 명 더 추가해야 한다면 변수를 선언하는 부분과 점수를 출력하는 부분의 코드도 추가해야한다. 학생을몇 명 더 추가하는 것은 개발자가 코딩으로 해결할 수 있겠지만, 학생을 수백 명 이상 추가해야 한다면 코드가 상당히 많이 늘어날 것이다. 결국 학생 수가 증가함에 따라 코딩 양이 비례해서 증가하는 문제가 발생한다.변수를 선언하는 부분을 보면 학생 수가 증가함에 따라 `int`형 변수를 계속해서 추가해야 한다. 학생 수가 5명이면 `int`형 변수를 5개 선언해야 하고, 학생 수가 100명이라면 `int`형 변수를 100개 선언해야 한다. 결국 비슷한 변수를 반복해서 선언하는 문제가 발생한다.반복문으로 해결할 수 있을 것 같지만, 점수를 출력하는 부분을 보면 변수의 이름이 다르기 때문에 반복문도 적용할 수 없다.이렇게 같은 타입의 변수를 반복해서 선언하고 반복해서 사용하는 문제를 해결하는 것이 바로 배열이다.배열의 선언과 생성배열은 같은 타입의 변수를 사용하기 편하게 하나로 묶어둔 것이다. 이전 예제를 배열을 사용하도록 변경해보자.참고로 단계적으로 구조를 변경해 나갈 것이다.**Array1Ref1 **```javapackage array;public class Array1Ref1 public static void main(String args) int students; //배열 변수 선언students = new int5; //배열 생성//변수 값 대입students0 = 90;students1 = 80;students2 = 70;students3 = 60;students4 = 50;//변수 값 사용System.out.println(학생1 점수: + students0);System.out.println(학생2 점수: + students1);System.out.println(학생3 점수: + students2);System.out.println(학생4 점수: + students3);System.out.println(학생5 점수: + students4);```지금부터 아주 간단해보이는 다음 두 줄을 아주 자세히 설명하겠다. 집중해서 따라오자.```javaint students; //1. 배열 변수 선언students = new int5; //2. 배열 생성```**1. 배열 변수 선언**배열을 사용하려면 `int students; `와 같이 배열 변수를 선언해야 한다.일반적인 변수와 차이점은 `int `처럼 타입 다음에 대괄호( ``)가 들어간다는 점이다.배열 변수를 선언한다고해서 아직 사용할 수 있는 배열이 만들어진 것은 아니다!`int a `에는 정수를, `double b `에는 실수를 담을 수 있다.`int students `와 같은 배열 변수에는 배열을 담을 수 있다. (배열 변수에는 10, 20 같은 값이 아니라배열이라는 것을 담을 수 있다)**2. 배열 생성**배열을 사용하려면 배열을 생성해야 한다.`new int5 `라고 입력하면 오른쪽 그림과 같이 총 5개의 `int`형 변수가 만들어진다.`new`는 새로 생성한다는 뜻이고, `int5 `는 `int`형 변수 5개라는 뜻이다. 따라서 `int`형 변수 5개를 다룰 수있는 배열을 새로 만든다는 뜻이다.앞서 `int student1 `, `int student2 ` . `int student5 `까지 총 5개의 변수를 직접 선언했다. 배열을 사용하면 이런 과정을 한번에 깔끔하게 처리할 수 있다.**배열과 초기화**`new int5 `라고 하면 총 5개의 `int`형 변수가 만들어진다. 자바는 배열을 생성할 때 그 내부값을 자동으로초기화한다.숫자는 `0`, `boolean `은 `false `, `String `은 `null `(없다는 뜻이다.)로 초기화 된다.**3. 배열 참조값 보관**`new int5 `로 배열을 생성하면 배열의 크기만큼 메모리를 확보한다.`int`형을 5개 사용하면 `4byte * 5 ` `20byte `를 확보한다.배열을 생성하고 나면 자바는 메모리 어딘가에 있는 이 배열에 접근할 수 있는 참조값(주소)( `x001 `)을 반환한다.여기서 `x001 `이라고 표현한 것이 참조값이다. (실제로 `x001 `처럼 표현되는 것은 아니고 이해를 돕기 위한예시이다.)앞서 선언한 배열 변수인 `int students `에 생성된 배열의 참조값( `x001 `)을 보관한다.`int students ` 변수는 `new int5 `로 생성한 배열의 참조값을 가지고 있다.이 변수는 참조값을 가지고 있다. 이 참조값을 통해 배열을 참조할 수 있다. 쉽게 이야기해서 참조값을 통해메모리에 있는 실제 배열에 접근하고 사용할 수 있다.참고로 배열을 생성하는 `new int5 ` 자체에는 아무런 이름이 없다! 그냥 `int`형 변수를 5개 연속으로만드는 것이다. 따라서 생성한 배열에 접근하는 방법이 필요하다. 따라서 배열을 생성할 때 반환되는 참조값을 어딘가에 보관해두어야 한다. 앞서 `int students `변수에 참조값( `x001 `)을 보관해두었다. 이 변수를 통해서 이 배열에 접근할 수 있다.이 부분을 풀어서 설명하면 다음과 같다.```javaint students = new int5; //1. 배열 생성int students = x001; //2. new int5의 결과로 x001 참조값 반환students = x001 //3. 최종 결과```참조값을 확인하고 싶다면 다음과 같이 배열의 변수를 출력해보면 된다.```javaSystem.out.println(students); //I@4617c264 @앞의 I는 int형 배열을 뜻한다. @뒤에 16진수는 참조값을 뜻한다.```참조값에 대한 더 자세한 내용은 뒤에서 다룬다. 지금은 생성한 배열을 참조할 수 있는, 메모리의 주소를 나타내는 특별한 값이 있다는 정도만 이해하면 충분하다.배열 사용인덱스배열은 변수와 사용법이 비슷한데, 차이점이 있다면 다음과 같이 ``사이에 숫자 번호를 넣어주면 된다. 배열의 위치를나타내는 숫자를 인덱스(index)라 한다.```java//변수 값 대입students0 = 90;students1 = 80;//변수 값 사용System.out.println(학생1 점수: + students0);System.out.println(학생2 점수: + students1);```**배열 참조 그림****배열은 0부터 시작한다**`new int5 `와 같이 5개의 요소를 가지는 `int`형 배열을 만들었다면 인덱스는 `0,1,2,3,4 `가 존재한다.여기서 주의해야 할 점이 있는데 인덱스는 0부터 시작한다는 것이다. 배열의 요소를 5개로 생성했지만, 인덱스는 0부터시작한다. 따라서 사용 가능한 인덱스의 범위는 `0 ~ (n-1) `이 된다. 그래서 `students4 `가 배열의 마지막 요소이다.만약 `students5 `와 같이 접근 가능한 배열의 인덱스 범위를 넘어가면 다음과 같은 오류가 발생한다.**인덱스 허용 범위를 넘어설 때 발생하는 오류**```Exception in thread main java.lang.ArrayIndexOutOfBoundsException: Index 5 outof bounds for length 5 at array.Array1Ref1.main(Array1Ref1.java:14)```배열에 값 대입배열에 값을 대입하든 배열의 값을 사용하든 간에 일반적인 변수와 사용법은 같다. 추가로 ``를 통해 인덱스만 넣어주면 된다.```javastudents0 = 90; //1. 배열에 값을 대입x0010 = 90; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에접근, 값 대입```javastudents1 = 80; //1. 배열에 값을 대입x0011 = 80; //2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에접근, 값 대입```배열 값 읽기```java//1. 변수 값 읽기System.out.println(학생1 점수: + students0);//2. 변수에 있는 참조값을 통해 실제 배열에 접근. 인덱스를 사용해서 해당 위치의 요소에 접근System.out.println(학생1 점수: + x0010);//3. 배

    2024.05.11 / 32pages ( 대학레포트 > 시험/강의/학업)

    태그 사용 배열 , 참조값 변수 , 8 배열
  • img
  • 7 훈련
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문7. 훈련#1.인강/0.자바/1.자바-입문/Scanner 학습/Scanner - 기본 예제/Scanner - 반복 예제/문제와 풀이1/문제와 풀이2/문제와 풀이3/문제와 풀이4/정리Scanner 학습훈련 시작지금까지 학습한 변수, 연산자, 조건문, 반복문은 프로그래밍의 가장 기본이 되는 기능이다. 대부분의 프로그램 언어는이 기능을 필수로 가진다. 그리고 프로그래머가 하는 일의 대부분은 지금까지 설명한 변수, 연산자, 조건문, 반복문을 다루는 일이다. 그래서 이 기능을 잘 다루는 것이 무엇보다 중요하다.이번 시간에는 지금까지 배운 내용들을 훈련하는 시간이다. 여러분이 다음으로 나아가기 전에 최소한의 기본기를 훈련하는 시간으로 생각하자지금까지 학습할 때 한가지 아쉬움이 있었는데, 바로 사용자의 입력이 없었다는 점이다.이번 시간에는 사용자의 입력을 받는 방법을 배워서, 좀 더 그럴듯한 프로그램을 만들어보자.**백문이 불여일타!**변수, 연산자, 조건문, 반복문을 머리로 이해하는 것은 전혀 어렵지 않다. 하지만 머리로 생각만 하는 것은 수영을이렇게 해야하겠지? 라고 머리로 생각하는 것과 같다. 중요한 것은 코딩을 몸이 익히는 것이다. 그러기 위해서는직접 코딩하는 것이 무엇보다 중요하다! 학생때 처럼 단순히 외우는 방식으로는 좋은 프로그래머가 될 수 없다. 예제 코드는 모두 따라해보고, 문제도 직접 다 풀어보자, 문제가 안풀리면 답을 보고 코드를 따라친 다음에 기존 코드를 모두 지우고 처음부터 본인이 스스로 다시 풀어보아도 좋다. 백문이 불여일타!Scanner`System.out `을 통해서 출력을 했듯이, `System.in `을 통해서 사용자의 입력을 받을 수 있다. 그런데 자바가 제공하는 `System.in `을 통해서 사용자 입력을 받으려면 여러 과정을 거쳐야해서 복잡하고 어렵다.자바는 이런 문제를 해결하기 위해 `Scanner `라는 클래스를 제공한다. 이 클래스를 사용하면 사용자 입력을 매우 편리하게 받을 수 있다.Scanner 예제1**Scanner1**```javapackage scanner;import java.util.Scanner;public class Scanner1 public static void main(String args) Scanner scanner = new Scanner(System.in);System.out.print(문자열을 입력하세요:);String str = scanner.nextLine(); // 입력을 String으로 가져옵니다.System.out.println(입력한 문자열: + str);System.out.print(정수를 입력하세요:);int intValue = scanner.nextInt(); // 입력을 int로 가져옵니다.System.out.println(입력한 정수: + intValue);System.out.print(실수를 입력하세요:);double doubleValue = scanner.nextDouble(); // 입력을 double로 가져옵니다.System.out.println(입력한 실수: + doubleValue);````Scanner scanner = new Scanner(System.in); `이 코드는 객체와 클래스를 배워야 정확히 이해할 수 있다. 지금은 `Scanner `의 기능을 사용하기 위해`new`를 사용해서 `Scanner `를 만든다 정도로 이해하면 된다. `Scanner `는 `System.in `을 사용해서 사용자의 입력을 편리하게 받도록 도와준다.`Scanner scanner ` 코드는 `scanner ` 변수를 선언하는 것이다. 이제부터 `scanner ` 변수를 통해서`scanner `를 사용할 수 있다.`scanner.nextLine() `엔터( `\n`)을 입력할 때 까지 문자를 가져온다.`scanner.nextInt() `입력을 `int`형으로 가져온다. 정수 입력에 사용한다.`scanner.nextDouble() `입력을 `double `형으로 가져온다. 실수 입력에 사용한다.**출력 예시**```문자열을 입력하세요:hello입력한 문자열: hello정수를 입력하세요:10입력한 정수: 10실수를 입력하세요:1.5입력한 실수: 1.5```**주의! - 다른 타입 입력시 오류**타입이 다르면 오류가 발생한다. 예제와 같이 숫자에 문자를 입력하면 오류가 발생한다.```문자열을 입력하세요:hello입력한 문자열: hello정수를 입력하세요:백만원Exception in thread main java.util.InputMismatchExceptionat java.base/java.util.Scanner.throwFor(Scanner.java:939)at java.base/java.util.Scanner.next(Scanner.java:1594)at java.base/java.util.Scanner.nextInt(Scanner.java:2258)at java.base/java.util.Scanner.nextInt(Scanner.java:2212)at scanner.Scanner1.main(Scanner1.java:15)```**print() vs println()**다음 코드를 보면 `println() `이 아니라 `print() `를 사용한다.`System.out.print(문자열을 입력하세요:)`그 이유는 다음과 같다.**print()** 출력하고 다음 라인으로 넘기지 않는다.```javaSystem.out.print(hello);System.out.print(world);//결과: helloworld```**println()** 출력하고 다음 라인으로 넘긴다.```javaSystem.out.println(hello);System.out.println(world);//결과:helloworld```우리가 엔터 키를 치면 ( `\n`)이라는 문자를 남기는 것이다.이 문자는 영어로 new line character, 한글로 줄바꿈 문자 또는 개행 문자라고 하는데, 이름 그대로 새로운 라인으로넘기라는 뜻이다. 콘솔에서는 이 문자를 보고 다음 라인으로 넘긴다.`println() `은 `print() `의 마지막에 `\n`을 추가한다. 따라서 다음 코드는 `println() `과 같다.```javaSystem.out.print(hello\n);System.out.print(world\n);//결과:helloworld```Scanner - 기본 예제Scanner 예제2이번에는 `Scanner `를 활용하는 간단한 예제를 만들어보자.두 수를 입력받고 그 합을 출력하는 예제이다.**Scanner2**```javapackage scanner;import java.util.Scanner;public class Scanner2 public static void main(String args) Scanner scanner = new Scanner(System.in);System.out.print(첫 번째 숫자를 입력하세요:);int num1 = scanner.nextInt();System.out.print(두 번째 숫자를 입력하세요:);int num2 = scanner.nextInt();int sum = num1 + num2;System.out.println(두 숫자의 합: + sum);```**실행 결과**```첫 번째 숫자를 입력하세요:10두 번째 숫자를 입력하세요:20두 숫자의 합: 30```이해하는데 어려움은 없을 것이다.Scanner 예제3사용자로부터 두 개의 정수를 입력 받고, 더 큰 수를 출력하는 프로그램을 작성해보자. 두 숫자가 같은 경우 두 숫자는같다고 출력하면 된다.조건문을 사용해서 처리할 수 있다.**Scanner3**```javapackage scanner;import java.util.Scanner;public class Scanner3 public static void main(String args) Scanner scanner = new Scanner(System.in);System.out.print(첫 번째 숫자를 입력하세요:);int num1 = scanner.nextInt();System.out.print(두 번째 숫자를 입력하세요:);int num2 = scanner.nextInt();if (num1 > num2) System.out.println(더 큰 숫자: + num1); else if (num2 > num1) System.out.println(더 큰 숫자: + num2); else System.out.println(두 숫자는 같습니다.);

    2024.05.11 / 24pages ( 대학레포트 > 시험/강의/학업)

    태그 사용자 숫자 , 코드 다음 , 7 훈련

위로

최근 판매 자료

img