Name : java-basicLocation : 프로젝트 위치, 임의 설정Language : JavaBuild system : IntelliJJDK : 자바 버전 17 이상Version : 21Vender : Oracle OpenJDK 21.0.1aarch64 : 애
자바 세상은 클래스와 객체로 이루어져 있다. 그만큼 클래스와 객체라는 개념은 중요하다. 그런데 클래스와 객체는 너무 많은 내용을 포함하고 있어서 한번에 이해하기 쉽지 않다. 여기서는 클래스와 객체라는 개념이 왜 필요한지, 클래스가 어떤 방식으로 발전하며 만들어졌는지 점
클래스를 사용해서 학생이라는 개념을 만들고, 각각의 학생 별로 본인의 이름, 나이, 성적을 관리해보자.class 키워드를 사용해서 학생 클래스(student)를 정의한다. 학생 클래스는 내부에 이름(name), 나이(age), 성적(grade) 변수를 가진다.이렇게 클
클래스를 통해 생성한 객체를 사용하려면 먼저 메모리에 존재하는 객체에 접근해야 한다. 객체에 접근하려면 .(점, dot)을 사용하면 된다.객체가 가지고 있는 멤버 변수(name, age, grade)에 값을 대입하려면 먼저 객체에 접근해야 한다.객체에 접근하려면 .(점
클래스는 객체를 생성하기 위한 ‘틀’ 또는 ‘설계도’이다. 클래스는 객체가 가져야 할 속성(변수)과 기능(메서드)를 정의한다. 예) 학생이라는 클래스는 속성으로 name, age, grade를 가진다.객체는 클래스에서 정의한 속성과 기능을 가진 실체이다. 객체는 서로
배열을 사용하면 특정 타입을 연속한 데이터 구조로 묶어서 편리하게 관리할 수 있다.Student 클래스를 사용한 변수들도 Student 타입이기 때문에 학생도 배열을 사용해서 하나의 데이터 구조로 묶어서 관리할 수 있다.Student 타입을 사용하는 배열을 도입해보자.
우리가 직접 정의한 Student 타입도 일반적인 변수와 동일하게 배열을 생성할 때 포함할 수 있다.생성과 선언을 동시에 하는 경우 다음과 같이 더 최적화 할 수 있다.배열을 사용한 덕분에 for문을 사용해서 반복 작업을 깔끔하게 처리할 수 있다.students\[i]
당신은 영화 리뷰 정보를 관리하려고 한다. 먼저, 영화 리뷰 정보를 담을 수 있는 MovieReview 클래스를 만들어보자.MovieReview 클래스는 다음과 같은 멤버 변수를 포함해야 한다.영화 제목 (title)리뷰 내용 (review)MovieReviewMain
변수의 데이터 타입을 가장 크게 보면 기본형과 참조형으로 분류할 수 있다. 사용하는 값을 변수에 직접 넣을 수 있는 기본형, 그리고 이전에 본 Student student1과 같이 객체가 저장된 메모리의 위치를 가리키는 참조값을 넣을 수 잇는 참조형으로 분류할 수 있다
자바에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입하는 것이다.기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사해서 대입하고, 참조형이면 변수에 들어 있는 참조값을 복사해서 대입한
기본형과 참조형이 메서드 호출에 따라서 어떻게 달라지는지 알아보자.📚 대원칙 : 자바는 항상 변수의 값을 복사해서 대입한다.자바에서 변수에 값을 대입하는 것은 변수에 들어있는 값을 복사해서 대입하는 것이다.기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다
이전에 보았던 class1.ClassStart3 코드에 중복되는 부분이 2가지 있다.name, age, grade에 값을 할당학생 정보를 출력이런 중복은 메서드를 통해 제거할 수 있다.참조형은 메서드를 호출할 때 참조값을 전달한다. 따라서 메서드 내부에서 전달된 참조값
멤버 변수 (필드) : 클래스에 선언지역 변수 : 메서드에 선언, 매개변수도 지역 변수의 한 종류name, age, grade는 멤버 변수이다.student1, student2는 지역 변수이다.a, x(매개변수)는 지역 변수이다.지역 변수는 이름 그대로 특정 지역에서만
참조형 변수에는 항상 객체가 있는 위치를 가리키는 참조값이 들어간다. 그런데 아직 가리키는 대상이 없거나, 가리키는 대상을 나중에 입력하고 싶다면 어떻게 해야할까?참조형 변수에는 아직 가리키는 대상이 없다면 null이라는 특별한 값을 넣어둘 수 있다. null은 값이
참조값 없이 객체를 찾아가면 NullPointerException이라는 예외가 발생한다.NullPointerException은 이름 그대로 null을 가리키다(Pointer)인데, 이때 발생하는 예외(Exception)다.null은 없다는 뜻이므로 결국 주소가 없는 곳
앞서 만들었던 다음 클래스에 있는 “상품 주문 시스템”을 리팩토링 하자.class1.ex.ProductOrderMain당신은 온라인 상점의 주문 관리 시스템을 만들려고 한다.먼저, 상품 주문 정보를 담을 수 있는 ProductOrder 클래스를 만들어보자.Product
✅ 대원칙 : 자바는 항상 변수의 값을 복사해서 대입한다. 자바에서 변수에 값을 대입하는 것은 변수에 들어 있는 값을 복사해서 대입하는 것이다. 기본형, 참조형 모두 항상 변수에 있는 값을 복사해서 대입한다. 기본형이면 변수에 들어 있는 실제 사용하는 값을 복사해서
절차 지향 프로그래밍은 이름 그대로 절차를 지향한다. 쉽게 이야기해서 실행 순서를 중요하게 생각하는 방식이다.절차 지향 프로그래밍은 프로그램의 흐름을 순차적으로 따르며 처리하는 방식이다. 즉 “어떻게”를 중심으로 프로그래밍 한다.객체 지향 프로그래밍은 이름 그대로 객체
MusicPlayerData라는 클래스를 만들고, 음악 플레이어에 사용되는 데이터들을 여기에 묶어서 멤버 변수로 사용하자.음악 플레이어에 사용되는 volume, isOn 속성을 MusicPlayerData의 멤버 변수에 포함했다.음악 플레이어와 관련된 데이터는 Musi
이전 코드를 보면 다음과 같이 중복되는 부분들이 있다.그리고 각각의 기능들은 이후에 재사용 될 가능성이 높다.음악 플레이어 켜기, 끄기볼륨 증가, 감소음악 플레이어 상태 출력각각의 기능을 메서드로 만든 덕분에 각각의 기능이 모듈화 되었다. 덕분에 다음과 같은 장점이 생
클래스는 데이터인 멤버 변수 뿐 아니라 기능 역할을 하는 메서드도 포함할 수 있다.ValueData라는 인스턴스를 생성하고 외부에서 ValueData.value에 접근해 숫자를 하나씩 증가시키는 단순한 코드이다. 코드를 보면 데이터인 value와 value의 값을 증가
데이터와 기능을 하나로 묶어서 음악 플레이어라는 개념을 온전히 하나의 클래스에 담아보자. 음악 플레이어라는 개념을 객체로 온전히 만드는 것이 중요하다.그러기 위해서는 프로그램의 실행 순서 보다는 음악 플레이어 클래스를 만드는 것 자체에 집중해야 한다. 음악 플레이어가
다음은 직사각형의 넓이(area), 둘레 길이(perimeter), 정사각형 여부(square)를 구하는 프로그램이다. 이 프로그램을 객체 지향으로 변경해보자. 절차 지향 프로그래밍 방식으로 되어 있는 코드를 객체 지향 프로그래밍 방식으로 변경해라.Rectangle 클
객체 지향 프로그래밍과 절차 지향 프로그래밍은 서로 대치되는 개념이 아니다. 객체 지향이라도 프로그램의 작동 순서는 중요하다. 다만 어디에 더 초점을 맞추는가에 둘의 차이가 있다.객체 지향의 경우 객체의 설계와 관계를 중시한다. 반만 절차 지향의 경우 데이터와 기능이
객체를 생성하는 시점에 어떤 작업을 하고 싶다면 생성자(Constructor)를 이용한다.먼저 생성자가 왜 필요한지 코드로 알아보자.회원 객체를 생성하고 나면 name, age, grade같은 변수에 초기값을 설정한다. 아마도 회원 객체를 제대로 사용하기 위해서는 객체
initMember(. . .)는 Member에 초기값 설정 기능을 제공하는 메서드이다.다음과 같이 메서드를 호출하면 객체의 멤버 변수에 인자로 넘어온 값을 채운다.member1.initMember(”user1”, 15, 90)Member의 코드를 다시 보자.initM
프로그래밍을 하다보면 객체를 생성하고 이후에 바로 초기값을 할당해야 하는 경우가 많다. 따라서 앞서 initMember(…)와 같은 메서드를 매번 만들어야 한다.그래서 대부분의 객체 지향 언어는 객체를 생성하자마자 즉시 필요한 기능을 좀 더 편리하게 수행할 수 있도록
매개변수가 없는 생성자를 기본 생성자라 한다.클래스에 생성자가 하나도 없으면 자바 컴파일러는 매개변수가 없고, 작동하는 코드가 없는 기본 생성자를 자동으로 만들어준다.생성자가 하나라도 있으면 자바는 기본 생성자를 만들지 않는다.MemberDefault 클래스에는 생성자
생성자도 메서드 오버로딩처럼 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.기존 MemberConstruct에 생성자를 하나 추가해서 생성자가 2개가 되었다.새로 추가한 생성자는 grade를 받지 않는다. 대신에 grade는 50점이 된다.생성자를 오버로딩 한
Section4 - 문제와 풀이
쇼핑몰 시스템을 개발한다고 가정해보자.다음과 같이 프로그램이 매우 작고 단순해서 클래스가 몇 개 없다면 크게 고민할 거리가 없겠지만, 기능이 점점 추가되어서 프로그램이 아주 커지게 된다면 어떻게 될까?아주 작은 프로그램큰 프로그램컴퓨터는 보통 파일을 분류하기 위해 폴더
패키지가 다르다고 pack.a.User와 같이 항상 전체 경로를 적어주는 것은 불편하다. 이때는 import를 사용하면 된다.코드에서 첫줄에는 package를 사용하고, 다음 줄에는 import를 사용할 수 있다.import를 사용하면 다른 패키지에 있는 클래스를 가져
패키지의 이름과 위치는 폴더(디렉토리) 위치와 같아야 한다. (필수)디렉토리 경로 검색 단축키 : command + shift + G 패키지 이름은 모두 소문자를 사용한다. (관례)패키지 이름의 앞 부분은 일반적으로 회사의 도메인 이름을 거꾸로 사용한다. com
com.helloshopuserUserUserServiceproductProductProductServiceorderOrderOrderServiceOrderHistory다른 패키지의 기능이 필요하면 import를 사용하면 된다.생성자를 보면 public이 붙어있다. p
자바는 public, private 같은 접근 제어자(access modifier)를 제공한다. 접근 제어자를 사용하면 해당 클래스 외부에서 특정 필드나 메서드에 접근하는 것을 허용하거나 제한할 수 있다.스피커에 들어가는 소프트웨어를 개발한다고 하자.스피커의 음량은 절
앞선 문제를 근본적으로 해결하는 방법은 volume 필드를 Speaker 클래스 외부에서는 접근하지 못하게 막는 것이다.private 접근 제어자는 모든 외부 호출을 막는다. 따라서 private이 붙은 경우 해당 클래스 내부에서만 호출할 수 있다.그림을 보면 volu
private : 모든 외부 호출을 막는다.default(package-private) : 같은 패키지 안에서 호출은 허용한다.protected : 같은 패키지 안에서 호출은 허용한다. 패키지가 달라도 상속 관계의 호출은 허용한다.public : 모든 외부 호출을 허용
필드와 메서드에서 접근 제어자 사용에 대해 알아보자.
클래스 레벨의 접근 제어자 사용에 대해 알아보자.
객체 지향 프로그래밍의 중요한 개념 중 하나인 캡슐화(Encapsulation)에 대해 알아보자.
Section6 - 문제와 풀이
메서드 영역 : 클래스 정보를 보관한다. 이 클래스 정보가 붕어빵 틀이다.스택 영역 : 실제 프로그램이 실행되는 영역이다. 메서드를 실행할 때 마다 하나씩 쌓인다.힙 영역 : 객체(인스턴스)가 생성되는 영역이다. new 명령어를 사용하면 이 영역을 사용한다.쉽게 이야기
나중에 넣은 것이 가장 먼저 나오는 것을 후입 선출이라 하고, 이런 자료 구조를 스택(Stack)이라 한다.다음과 같은 1, 2, 3 이름표가 붙은 블럭이 있다고 가정하자.이 블럭을 다음과 같이 생긴 통에 넣는다고 생각해보자. 위쪽만 열려있기 때문에 위쪽으로 블럭을 넣
처음 자바 프로그램을 실행하면 main()을 실행한다. 이때 main()을 위한 스택 프레임이 하나 생성된다.main() 스택 프레임은 내부에 args라는 매개변수를 가진다.main()은 method1()을 호출한다. method1() 스택 프레임이 생성된다.metho
스택 영역과 힙 영역이 함께 사용되는 경우를 알아보자.main() → method1() → method2() 순서로 호출하는 단순한 코드다.method1()에서 Data 클래스의 인스턴스를 생성한다.method1()에서 method2()를 호출할 때 매개변수에 Data
생성된 객체의 수를 세어야 한다. 따라서 객체가 생성될 때 마다 생성자를 통해 인스턴스의 멤버 변수인 count 값을 증가시킨다.객체를 생성하고 카운트 값을 출력한다.이 프로그램은 기대한 대로 작동하지 않는다. 객체를 생성할 때 마다 Data1 인스턴스가 새로 만들어지
특정 클래스에서 공용으로 사용할 변수를 생성할 때 유용한 static 변수에 대해 알아보자.
인스턴스 변수와 클래스 변수에 대해 알아보자.
인스턴스 메서드와 static 메서드에 대해 알아보고 static 메서드가 필요한 이유에 대해 알아보자.
인스턴스 메서드와 static 메서드가 호출되는 과정의 차이를 알아보자.
멤버 메서드의 종류와 그 중 static 메서드의 접근법, static import에 대해 알아보고, main() 메서드에서 static 메서드를 호출하는 방법에 대해 알아보자.
Section7 문제 풀이
final 키워드에 대한 설명과 final이 각각의 변수에서 어떻게 적용되는지 알아본다.
Java의 상수에 대해 알아보자.
final 변수의 참조에 대해 알아보자.
final 키워드 정리
상속 관계가 왜 필요한지 예제를 통해 알아보자.
Java의 상속 관계에 대해 알아보자.
상속 관계로 객체를 생성할 때 메모리 구조를 확인해보자.
상속 관계의 장점을 활용해 기능을 추가해보자.
상속 관계에서 메서드 오버라이딩에 대해 알아보자.
상속 관계와 접근 제어에 대해 알아보자.
super 키워드에 대해 알아보자.
상속 관계에서 super를 활용한 생성자 호출 과정에 대해 알아보자.
Section9 문제와 풀이
다형성(Polymorphism)의 핵심 이론 중 다형적 참조에 대해 알아본다.
캐스팅의 뜻과 구현 방법에 대해 알아본다.
일시적 다운캐스팅과 업캐스팅에 대해 알아본다.
다운캐스팅은 잘못하면 심각한 런타임 오류가 발생할 수 있다.
instanceof에 대해 알아보자.
다형성을 이루는 중요한 핵심 이론인 메서드 오버라이딩에 대해 알아보자.
다형성의 장점을 알아보기 위해 우선 다형성을 사용하지 않고 프로그램을 개발해보자.
앞서 설명한 예제를 다형성을 사용하도록 변경해보자.
이번에는 배열과 for문을 사용해서 중복을 제거해보자.
추상 클래스와 추상 메서드에 대해 알아보자.
순수 추상 클래스에 대해 알아보자.
자바 인터페이스에 대해 알아보자.
클래스의 다중 상속을 허용하지 않지만 인터페이스의 다중 구현은 허용하는 이유에 대해 알아보자.
클래스 상속과 인터페이스 구현을 함께 사용하는 예를 알아보자.
객체 지향 프로그래밍에서 가장 중요한 개념은 무엇이며 좋은 객체 지향 프로그램이란 무엇인지 알아보는 글.
앞서 설명한 내용을 더 깊이있게 이해하기 위해, 간단한 운전자와 자동차의 관계를 개발해보자. 먼저 다형성을 사용하지 않고, 역할과 구현을 분리하지 않고 단순하게 개발해보자.
새로운 요구사항이 들어왔을 때 다형성을 고려하지 않고 코드를 개선하면 생기는 문제점은 뭘까?
다형성을 활용하면 역할과 구현을 분리해서, 클라이언트 코드의 변경 없이 구현 객체를 변경할 수 있다.
좋은 객체 지향 설계 원칙 중 하나로 OCP 원칙이라는 것이 있다.
Section12 - 문제와 풀이