대학레포트

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

  • 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 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 / 0pages ( 대학레포트 > 시험/강의/학업)

    태그 , , 7 훈련
  • img
  • 6 스코프, 형변환
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문6. 스코프, 형변환#1.인강/0.자바/1.자바-입문/스코프1 - 지역 변수와 스코프/스코프2 - 스코프 존재 이유/형변환1 - 자동 형변환/형변환2 - 명시적 형변환/계산과 형변환/정리스코프1 - 지역 변수와 스코프변수는 선언한 위치에 따라 지역 변수, 멤버 변수(클래스 변수, 인스턴스 변수)와 같이 분류된다.우리가 지금까지 학습한 변수들은 모두 영어로 로컬 변수(Local Variable) 한글로 지역 변수라 한다. 나머지 변수들은뒤에서 학습한다 지금은 지역 변수만 기억하자.지역 변수는 이름 그대로 특정 지역에서만 사용할 수 있는 변수라는 뜻이다. 그 특정 지역을 벗어나면 사용할 수 없다.여기서 말하는 지역이 바로 변수가 선언된 코드 블록( ``)이다. 지역 변수는 자신이 선언된 코드 블록( ``) 안에서만 생존하고, 자신이 선언된 코드 블록을 벗어나면 제거된다. 따라서 이후에는 접근할 수 없다.예제 코드로 확인해보자**Scope1**```javapackage scope;public class Scope1 public static void main(String args) int m = 10; //m 생존 시작if (true) int x = 20; //x 생존 시작System.out.println(if m = + m); //블록 내부에서 블록 외부는 접근 가능System.out.println(if x = + x); //x 생존 종료//System.out.println(main x = + x); //오류, 변수 x에 접근 불가System.out.println(main m = + m); //m 생존 종료````int m ``int m `은 `main `의 코드 블록안에서 선언되었다. 따라서 변수를 선언한 시점부터 `main `의 코드 블록이 종료될 때 까지 생존한다.`if `블록 내부에서도 외부 블록에서 선언된 `m`에 접근할 수 있다. 쉽게 이야기해서 생존 범위만 맞으면 다접근할 수 있다.`int x ``int x `는 `if `블록안에서 선언되었다. 따라서 변수를 선언한 시점부터 `if `의 코드 블록이 종료될 때까지 생존한다.`if ` 내부에서는 자신의 범위에서 선언한 `x`에 당연히 접근할 수 있다.`if ` 코드 블록이 끝나버리면 `x`는 제거된다. 따라서 더는 `x`에 접근할 수 없다. 따라서 이후에 접근하면`cannot find symbol `이라는 변수 이름을 찾을 수 없다는 컴파일 오류가 발생한다.정리하면 지역 변수는 본인의 코드 블록 안에서만 생존한다. 그리고 자신의 코드 블록 안에서는 얼마든지 접근할 수 있다. 하지만 자신의 코드 블록을 벗어나면 제거되기 때문에 접근할 수 없다.**이렇게 변수의 접근 가능한 범위를 스코프(Scope)라 한다. 참고로 Scope를 번역하면 범위라는 뜻이다.**`int m `은 `main `전체에서 접근할 수 있기 때문에 스코프가 넓고, `int x `는 `if ` 코드 블록 안에서만 접근할 수있기 때문에 스코프가 좁다.이번에는 `if ` 대신에 `for `를 사용하는 예제를 보자**Scope2**```javapackage scope;public class Scope2 public static void main(String args) int m = 10;for (int i = 0; i < 2; i++) //블록 내부, for문 내System.out.println(for m = + m); //블록 내부에서 외부는 접근 가능System.out.println(for i = + i); //i 생존 종료//System.out.println(main i = + i); //오류, i에 접근 불가System.out.println(main m = + m);````for`문으로 바뀐 것을 제외하면 앞의 예제와 비슷한 예제이다.`for`문의 경우 `for(int i=0;) `과 같이 `for`문 안에서 초기식에 직접 변수를 선언할 수 있다. 그리고 이렇게 선언한 변수는 `for`문 코드 블록 안에서만 사용할 수 있다.스코프2 - 스코프 존재 이유변수를 선언한 시점부터 변수를 계속 사용할 수 있게 해도 되지 않을까? 왜 복잡하게 접근 범위(스코프)라는 개념을 만들었을까?이해를 위해 다음 코드를 보자**Scope31 **```javapackage scope;public class Scope31 public static void main(String args) int m = 10;int temp = 0;if (m > 0) temp = m * 2;System.out.println(temp = + temp);System.out.println(m = + m);```조건이 맞으면 변수 `m`의 값을 2배 증가해서 출력하는 코드이다. 여기서 2배 증가한 값을 저장해두기 위해 임시 변수`temp `를 사용했다. 그런데 이 코드는 좋은 코드라고 보기는 어렵다. 왜냐하면 임시 변수 `temp `는 `if` 조건이 만족할때 임시로 잠깐 사용하는 변수이다. 그런데 임시 변수 `temp ` `main() ` 코드 블록에 선언되어 있다. 이렇게 되면 다음과같은 문제가 발생한다.**비효율적인 메모리 사용**: `temp `는 `if`코드 블록에서만 필요하지만, `main() `코드 블록이 종료될 때 까지 메모리에 유지된다. 따라서 불필요한 메모리가 낭비된다. 만약 `if` 코드 블록 안에 `temp `를 선언했다면 자바를 구현하는 곳에서 `if` 코드 블록의 종료 시점에 이 변수를 메모리에서 제거해서 더 효율적으로 메모리를 사용할 수 있다.**코드 복잡성 증가**: 좋은 코드는 군더더기 없는 단순한 코드이다. `temp `는 `if`코드 블록에서만 필요하고, 여기서만 사용하면 된다. 만약 `if` 코드 블록 안에 `temp `를 선언했다면 `if`가 끝나고 나면 `temp `를 전혀 생각하지 않아도 된다. 머리속에서 생각할 변수를 하나 줄일 수 있다. 그런데 지금 작성한 코드는 `if` 코드 블록이 끝나도`main() ` 어디서나 `temp `를 여전히 접근할 수 있다. 누군가 이 코드를 유지보수 할 때 `m`은 물론이고 `temp `까지계속 신경써야 한다. 스코프가 불필요하게 넓은 것이다. 지금은 코드가 매우 단순해서 이해하는데 어려움이 없겠지만 실무에서는 코드가 매우 복잡한 경우가 많다.`temp `의 스코프를 꼭 필요한 곳으로 한정해보자**Scope32 **```javapackage scope;public class Scope32 public static void main(String args) int m = 10;if (m > 0) int temp = m * 2;System.out.println(temp = + temp);System.out.println(m = + m);````temp `를 `if` 코드 블록 안에서 선언했다. 이제 `temp `는 `if` 코드 블록 안으로 스코프가 줄어든다. 덕분에 `temp ` 메모리를 빨리 제거해서 메모리를 효율적으로 사용하고, `temp ` 변수를 생각해야 하는 범위를 줄여서 더 유지보수 하기 좋은코드를 만들었다.while문 vs for문 - 스코프 관점이제 스코프 관점에서 `while `문과 `for`문을 비교해보자다음 코드들은 기존에 반복문에서 학습했던 코드이다.**While**```javapackage loop;public class While23 public static void main(String args) int sum = 0;int i = 1;int endNum = 3;while (i

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

    태그 , , 6 스코프, 형변환
  • img
  • 5 반복문
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문5. 반복문#1.인강/0.자바/1.자바-입문/반복문 시작/while문1/while문2/do-while문/break, continue /for문1/for문2/중첩 반복문/문제와 풀이1/문제와 풀이2/정리반복문 시작반복문은 이름 그대로 특정 코드를 반복해서 실행할 때 사용한다.자바는 다음 3가지 종류의 반복문을 제공한다.`while `, `do-while `, `for`먼저 간단한 예제를 통해 반복문이 왜 필요한지 이유를 알아보자.1을 한 번씩 더해서 총 3번 더하는 간단한 코드를 만들어보자.**While11**```javapackage loop;public class While11 public static void main(String args) int count = 0;count = count + 1;System.out.println(현재 숫자는: + count);count = count + 1;System.out.println(현재 숫자는: + count);count = count + 1;System.out.println(현재 숫자는: + count);```**출력**```현재 숫자는:1현재 숫자는:2현재 숫자는:3```단순히 `count `에 값을 1씩 3번 더하는 단순한 예제이다. 최종 결과는 `3`이다.`count = count + 1 `은 증감 연산자( `++`)를 사용해서 다음과 같이 개선할 수 있다.```java//개선count++;System.out.println(현재 숫자는: + count);count++;System.out.println(현재 숫자는: + count);count++;System.out.println(현재 숫자는: + count);```하지만 같은 코드가 3번 반복되고 있다. 이번에는 1을 한 번씩 더해서 총 100번 더하는 코드를 만들어보자아마도 직접 작성한다면 같은 코드가 100번 반복될 것이다.이렇게 특정 코드를 반복해서 실행할 때 사용하는 것이 바로 반복문이다.반복문에는 `while `, `for`문이 있다. 먼저 `while `문부터 알아보자.while문1while문은 조건에 따라 코드를 반복해서 실행할 때 사용한다.```javawhile (조건식) // 코드```조건식을 확인한다. 참이면 코드 블럭을 실행하고, 거짓이면 while문을 벗어난다.조건식이 참이면 코드 블럭을 실행한다. 이후에 코드 블럭이 끝나면 다시 조건식 검사로 돌아가서 조건식을 검사한다.(무한 반복)while문을 사용해서 1을 한 번씩 더해서 총 3번 더하는 코드를 만들어보자**While12**```javapackage loop;public class While12 public static void main(String args) int count = 0;while (count < 3) count++;System.out.println(현재 숫자는: + count);```**출력 결과**```현재 숫자는:1현재 숫자는:2현재 숫자는:3```**while문 실행1, count=0****while문 실행2, count=1****while문 실행3, count=2****while문 실행4, count=3**`while (count < 3) `에서 코드 블럭을 반복 실행한다. 여기서 `count `의 값이 `1`, `2`, `3`으로 점점 커지다가 결국`count < 3 `이 거짓이 되면서 `while `문을 빠져나간다.`while(count < 3) `에 있는 숫자를 `while(count < 100) `으로 변경하면 `while `문의 코드 블럭을 100번 반복한다.while문2이번에는 난이도를 조금 높여보자. 다음 문제를 같이 풀어보자.**문제: 1부터 하나씩 증가하는 수를 3번 더해라 (1 ~ 3 더하기)**이 문제는 1부터 하나씩 증가하는 수이기 때문에 1 + 2 + 3을 더해야 한다.우선 `while `문을 사용하지 않고 단순 무식하게 풀어보자.**While21**```javapackage loop;public class While21 public static void main(String args) int sum = 0;sum = sum + 1; //sum(0) + 1 -> sum(1)System.out.println(i= + 1 + sum= + sum);sum = sum + 2; //sum(1) + 2 -> sum(3)System.out.println(i= + 2 + sum= + sum);sum = sum + 3; //sum(3) + 3 -> sum(6)System.out.println(i= + 3 + sum= + sum);```**출력 결과**```i=1 sum=1i=2 sum=3i=3 sum=6```이 코드의 정답은 맞다. 하지만 개선할 점이 많이 있는데, 무엇보다 변경에 유연하지 않다.다음과 같이 요구사항이 변경되었다.**문제: 10부터 하나씩 증가하는 수를 3번 더해라 (10 ~12더하기)**이렇게 되면 `10 + 11 + 12 `를 계산 해야한다. 문제는 코드를 너무 많이 변경해야 한다는 점이다.변수를 사용해서 더 변경하기 쉬운 코드로 만들어보자. 변경되는 부분을 변수 `i`로 바꾸어보자.**문제: i부터 하나씩 증가하는 수를 3번 더해라 (i ~ i+2더하기)****While22**```javapackage loop;public class While22 public static void main(String args) int sum = 0;int i = 1;sum = sum + i; //sum(0) + i(1) -> sum(1)System.out.println(i= + i + sum= + sum);i++; //i=2sum = sum + i; //sum(1) + i(2) -> sum(3)System.out.println(i= + i + sum= + sum);i++; //i=3sum = sum + i; //sum(3) + i(3) -> sum(6)System.out.println(i= + i + sum= + sum);```**출력 결과**```//i=1i=1 sum=1i=2 sum=3i=3 sum=6```변수 `i`를 사용한 덕분에 `i`의 값만 변경하면 나머지 코드를 전혀 변경하지 않아도 된다.`i=10 `으로 변경하면 다른 코드의 변경 없이 앞서 이야기한 `10 + 11 + 12 `의 문제도 바로 풀 수 있다.**출력 결과**```

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

    태그 , , 5 반복문
  • img
  • 4 조건문
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문4. 조건문#1.인강/0.자바/1.자바-입문/if문1 - if, else/if문2 - else if/if문3 - if문과 else if문/switch문/삼항 연산자/문제와 풀이1/문제와 풀이2/정리if문1 - if, else조건문 시작지금까지 살펴본 프로그램은 단순히 위에서 아래로 순서대로 한 줄씩 실행되었다.특정 조건에 따라서 다른 코드를 실행하려면 어떻게 해야할까? 예를 들어서 만약 18살 이상이면 성인입니다를 출력하고, 만약 18살 미만이라면 미성년자입니다.를 출력해야 한다.아마도 다음과 같이 코딩을 해야할 것 같다.```만약 (나이 >= 18)면 성인입니다만약 (나이 < 18)면 미성년자입니다```영어로 하면 다음과 같다.```if (age >= 18) 성인입니다if (age < 18) 미성년자입니다```이렇게 특정 조건에 따라서 다른 코드를 실행하는 것을 조건문이라 한다.조건문에는 `if`문, `switch `문이 있다. 둘다 특정 조건에 따라서 다른 코드를 실행하는 것이라 생각하면 된다.먼저 `if`문부터 알아보자.if문`if`문은 특정 조건이 참인지 확인하고, 그 조건이 참( `true `)일 경우 특정 코드 블록을 실행한다.```javaif (condition) // 조건이 참일 때 실행되는 코드```코드 블록: ``(중괄호) 사이에 있는 코드**If1**```javapackage cond;public class If1 public static void main(String args) int age = 20; // 사용자 나이if (age >= 18) System.out.println(성인입니다.);if (age < 18) System.out.println(미성년자입니다.);```**실행 결과**```성인입니다.````age = 20 ` 값을 주면 처음 `if`문에서 참이 된다.**if (age >= 18) 분석**```java//age = 20if (age >= 18) 성인입니다if (20 >= 18) 성인입니다 //age의 값은 20이다.if (true) 성인입니다 //조건이 참으로 판명된다.성인입니다 //if문에 있는 코드 블록이 실행된다.```조건이 참이므로 `성인입니다.`가 화면에 출력된다.이후에 다음 코드가 실행된다.**if (age < 18) 분석**```javaif (age < 18) 미성년자입니다if (20 < 18) 미성년자입니다 //age의 값은 20이다.if (false) 미성년자입니다 //조건이 거짓으로 판명된다.//해당 코드 블록은 실행되지 않는다.```조건이 거짓이므로 `if`문 블록을 실행하지 않고, 빠져나온다. 따라서 `미성년자입니다`는 화면에 출력되지 않는다.`int age = 20 `의 값을 `15`로 변경하면 `미성년자입니다.`가 출력되는 것을 확인할 수 있다.else문`else `문은 `if`문에서 만족하는 조건이 없을 때 실행하는 코드를 제공한다.```javaif (condition) // 조건이 참일 때 실행되는 코드 else // 만족하는 조건이 없을 때 실행되는 코드````else `문을 사용하면 앞서 진행했던 프로그램을 다음과 같이 더 간략하게 바꿀 수도 있다.기존: 만약 18살 이상이면 성인입니다를 출력하고, 만약 18살 미만이라면 미성년자입니다.를 출력해야 한다.변경: 만약 18살 이상이면 성인입니다를 출력하고, 그렇지 않으면 미성년자입니다.를 출력해야 한다.쉽게 이야기해서 18살이 넘으면 성인이고, 그렇지 않으면 모두 미성년자이다.아마도 다음과 같이 코딩을 해야할 것 같다.```만약 (나이 >= 18)면 성인입니다그렇지 않으면 미성년자입니다```영어로 하면 다음과 같다.```if (age >= 18) 성인입니다else 미성년자입니다```**If2**```javapackage cond;public class If2 public static void main(String args) int age = 20; // 사용자의 나이if (age >= 18) System.out.println(성인입니다.); //참일 때 실행 else System.out.println(미성년자입니다.);//만족하는 조건이 없을 때 실행```**실행 결과**```성인입니다.````int age = 20 `의 값을 `15`로 변경하면 `미성년자입니다.`가 출력되는 것을 확인할 수 있다.if문2 - else if다음 문제를 코드로 풀어보자.**문제**당신은 연령에 따라 다른 메시지를 출력하는 프로그램을 작성해야 한다.이 프로그램은 `int age `라는 변수를 사용해야 하며, 연령에 따라 다음의 출력을 해야 한다.7세 이하일 경우: 미취학8세 이상 13세 이하일 경우: 초등학생14세 이상 16세 이하일 경우: 중학생17세 이상 19세 이하일 경우: 고등학생20세 이상일 경우: 성인`if`문을 사용해서 코드를 작성해보자.**If3**```javapackage cond;public class If3 public static void main(String args) int age = 14;if(age = 8 && age = 14 && age = 17 && age = 20) //20~: 성인System.out.println(성인);```이 코드는 다음과 같은 단점이 있다.불필요한 조건 검사: 이미 조건을 만족해도 불필요한 다음 조건을 계속 검사한다. 예를 들어서 나이가 5살이라면미취학이 이미 출력이 된다. 그런데 나머지 `if`문을 통한 조건 검사도 모두 실행해야 한다.코드 효율성: 예를 들어서 나이가 8살인 초등학생이라면 미취학을 체크하는 조건인 `age = 8&& age = 8 `이라는 조건은 이미 앞의 `age

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

    태그 , , 4 조건문
  • img
  • 3 연산자
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문3. 연산자#1.인강/0.자바/1.자바-입문/산술 연산자/문자열 더하기/연산자 우선순위/증감 연산자/비교 연산자/논리 연산자/대입 연산자/문제와 풀이/정리산술 연산자연산자 시작`+`, `-`, `*`, `/`와 같이 계산을 수행하는 기호를 연산자라 한다. 자바에는 다음과 같은 다양한 연산자가 있다. 참고로 더많은 연산자가 있지만, 여기서는 실무에서 주로 다루는 연산자 위주로 설명하겠다.**연산자 종류**산술 연산자: `+`, `-`, `*`, `/`, `%`(나머지 연산자)증감(증가 및 감소) 연산자: `++`, ``비교 연산자: ``, `!=`, `>`, `=`, ` String) //숫자를 문자열로 변경a + b = + 10 //문자열과 문자열 더하기a + b = 10 //결과```**문자열과 숫자 더하기2**변수에 담겨 있어도 문자와 숫자를 더하면 문자가 된다. 계산 과정을 확인해보자.**계산 과정**```javastr(String) + num(int)a + b = (String) + num(int) //str 변수에서 값 조회a + b = (String) + 20(int) //num 변수에서 값 조회a + b = (String) + 20(int -> String) //숫자를 문자열로 변경a + b = + 20 //문자열과 문자열 더하기a + b = 20 //결과```자바는 문자열인 `String ` 타입에 다른 타입을 더하는 경우 대상 타입을 문자열로 변경한다. 쉽게 이야기해서 문자열에더하는 것은 다 문자열이 된다.연산자 우선순위

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

    태그 , , 3 연산자
  • img
  • 2 변수
  • 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문 인프런 김영한의 자바 입문2. 변수#1.인강/0.자바/1.자바-입문/변수 시작/변수 값 변경/변수 선언과 초기화/변수 타입1/변수 타입2/변수 명명 규칙/문제와 풀이/정리변수 시작변수에 대해서 본격적으로 알아보기 전에 다음 코드를 작성하고 실행해보자.**Var1**```javapackage variable;public class Var1 public static void main(String args) System.out.println(10);System.out.println(10);System.out.println(10);```**패키지(package)**이번에는 처음으로 패키지를 만든다.패키지는 지금 단계에서는 자바 파일을 구분하기 위한 폴더로 이해하면 된다.`variable `라는 패키지를 만들었다면, 해당 패키지에 들어가는 자바 파일 첫줄에 `package variable; `와 같이 소속된 패키지를 선언해주어야 한다.자바 파일이 위치하는 패키지와 `package variable ` 선언 위치가 같아야 한다.**실행 결과**```10```단순히 숫자 10을 3번 출력하는 코드이다. 그런데 여기서 숫자 10을 3번 출력하는 대신에 숫자 20을 3번 출력하도록코드를 변경해보자. 어떻게 해야할까?**Var1**```javapackage variable;public class Var1 public static void main(String args) System.out.println(20); //변경 10 -> 20System.out.println(20); //변경 10 -> 20System.out.println(20); //변경 10 -> 20```숫자 10이라고 적혀 있는 곳을 모두 찾아서 숫자 20으로 변경해야 한다. 여기서는 총 3번의 코드 변경이 발생했다.단순한 예제여서 코드를 3번만 변경했지만, 만약 숫자 10을 출력하는 부분이 100개라면 100개의 코드를 모두 변경해야 한다.더 나아가서 사용자가 숫자를 입력하고, 사용자가 입력한 숫자를 출력하고 싶다면 어떻게 해야할까? 사용자가 입력한값은 항상 변한다. 누군가는 100을 입력하고 누군가는 200을 입력할 수도 있다. (사용자 입력은 뒤에서 다룬다)결국 어딘가에 값을 보관해두고 필요할 때 값을 꺼내서 읽을 수 있는 저장소가 필요하다. 쉽게 비유하자면 데이터를 담을 수 있는 그릇이 필요하다.모든 프로그래밍 언어는 이런 문제를 해결하기 위해 **변수(variable)**라는 기능을 제공한다. 변수는 이름 그대로 변할 수있다는 뜻이다.다음 코드를 작성해보자.**Var2**```javapackage variable;public class Var2 public static void main(String args) int a; //변수 선언a = 10; //변수 초기화System.out.println(a);System.out.println(a);System.out.println(a);```**a = 10 실행 결과**```10```이번에는 `a = 20 `으로 변경해서 실행해보자**Var2**```javapackage variable;public class Var2 public static void main(String args) int a; //변수 선언a = 20; //10 -> 20으로 변경System.out.println(a);System.out.println(a);System.out.println(a);```**a = 20 실행 결과**```20````a`의 값을 변경하면 출력결과가 모두 함께 변경되는 것을 확인할 수 있다.코드를 간단히 분석해보자.**변수 선언**`int a `숫자 정수( `integer `)를 보관할 수 있는 이름이 `a`라는 데이터 저장소를 만든다. 이것을 변수라 한다.이렇게 변수를 만드는 것을 변수 선언이라 한다.이제 변수 `a`에는 숫자 정수를 보관할 수 있다.숫자 정수 뿐만 아니라 문자, 소수와 같이 다양한 종류 값을 저장할 수 있는 변수들이 있다. 우선은 숫자 정수를 저장하는 `int`를 알아두자**변수에 값 대입**`a = 10 `자바에서 `=`은 오른쪽에 있는 값을 왼쪽에 저장한다는 뜻이다. 수학에서 이야기하는 두 값이 같다( `equals `)와는다른 뜻이다!숫자를 보관할 수 있는 데이터 저장소인 변수 `a`에 값 `10`을 저장한다.이처럼 선언한 변수에 처음으로 값을 대입해서 저장하는 것을 변수 초기화라 한다.**변수 값 읽기**`System.out.println(a) `변수에 저장되어 있는 값을 읽어서 사용하는 방법은 간단하다. 변수 이름을 적어주기만 하면 된다.변수 `a`에 `10`이 들어가 있다면 자바는 실행 시점에 변수의 값을 읽어서 사용한다. 따라서 다음과 같이 해석된다.`System.out.println(a) //변수 a의 값을 읽음``System.out.println(10) //a의 값인 10으로 변경, 숫자 10 출력`참고로 변수의 값은 반복해서 읽을 수 있다. 변수의 값을 읽는다고 값이 없어지는 것이 아니다.변수 값 변경변수는 이름 그대로 변할 수 있는 수이다. 쉽게 이야기해서 변수 `a`에 저장된 값을 언제든지 바꿀 수 있다는 뜻이다.이번에는 중간에 변수의 값을 변경해보자.**Var3**```javapackage variable;public class Var3 public static void main(String args) int a; //변수 선언a = 10; //변수 초기화: a(10)System.out.println(a); //10 출력a = 50; //변수 값 변경: a(10 -> 50)System.out.println(a); //50 출력

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

    태그 , , 2 변수

위로

최근 판매 자료

img