1.95k likes | 2.22k Views
1 ███████████. 1. 3 rd Edition. 소설같은. 자바. since 2001. 최 영 관 Powered by http://www.jabook.org . 1장 언어의 기본. 1.1 Overview. 1.1.1 핵심 Question. 데이터 타입을 학습할 때의 문제점 데이터 타입을 너무 쉽게 정의 내려 버리기 때문에 정작 데이터 타입이 뭔지도 모르고 계속해서 뭔가를 습득해 나가는 것이다 . 핵심 Question 데이터 타입은 xxx xx 이다 .
E N D
3rd Edition 소설같은 자바 since 2001 최 영 관 Powered by http://www.jabook.org 1장 언어의 기본
1.1.1 핵심 Question • 데이터 타입을 학습할 때의 문제점 • 데이터 타입을 너무 쉽게 정의 내려 버리기 때문에 정작 데이터 타입이 뭔지도 모르고 계속해서 뭔가를 습득해 나가는 것이다. • 핵심 Question • 데이터 타입은 xxx xx이다. • 데이터 타입은 xxx을(를) xx하는 도구이다. • 데이터 타입은 xx가 있다. • 데이터 타입은 xx가 있다. • 데이터 타입으로 xx를 만든다. • 변수의 선언은 xxx xx을 의미한다. • 변수에는 xx를 할당할 수 있다. 이장을 학습하면서 해답을 찾아보자.
1.1.2Introduction • 자바학습 • C++의 문법과 객체지향 기술을 터득해야 한다. • 클래스(class) • C++ 계열 언어에서 등장하는 가장 핵심적이며 중요한 단어이다. • 데이터 타입(Data Type) • 클래스를 학습하기 위한 기초지식 • 클래스와 데이터 타입의 관계 • 클래스는 데이터 타입에서 출발한다. • 학습 내용 • 1장 • 데이터 타입 • 2장 • 클래스의 기초개념
1.1.3 데이터 타입이란? • 데이터 타입이란 • 데이터 타입은 메모리를 생성하기 위한 도구이다. • 메모리 생성 • 자바에서 메모리를 생성하는 유일한 방법은 데이터 타입을 이용하는 것이다. • 메모리의 크기 • 메모리를 생성할 때 가장 중요한 정보 • 메모리를 얻고 사용하는 절차 • 필요한 메모리의 크기(Size)를 정한다. • 크기에 해당하는 만큼의 메모리를 얻는다. • 메모리에 데이터를 집어넣는다. • int a; • int • int는 데이터 타입이다. • int는 4바이트의 크기를 의미한다. • a • 메모리에 연결된 이름 • 4바이트의 메모리를 생성한다. • 생성된 메모리의 위치(주소)를 a라는 이름에 연결시켜 준다. • 데이터 타입과 메모리 • 데이터 타입은 메모리를 얻기 위한 수단으로 사용된다. • 데이터 타입은 크기(Size)가 있다.
1.1.4 자바의 최종 목표 • 데이터 타입과 클래스 • 데이터 타입의 개념을 이해하는 것은 클래스를 이해하기 위한 수단이 된다. • 자바의 최종 목표 • 자바는 클래스를 기반으로 하고 있다. • 클래스를 정복하는 것이 자바의 최종목표이다. • 어셈블리에서 C 언어로의 발전 • 새롭게 제공된 다양한 데이터 타입(Data Type)과 함수(Function)의 편리한 사용 • C++ 언어로의 발전 • C++ 언어로 발전하면서 데이터 타입은 클래스로 발전하게 된다. 이유를 알면 클래스의 개념을 깨우칠 수 있다.
1.2.1 데이터 타입의 첫 번째 목적 • 기본 데이터 타입(Primitive Data Type) • 컴파일러 차원에서 미리 제공하는 데이터 타입을 기본 데이터 타입이라고 한다. • 자바에서 제공하는 기본 데이터 타입 • byte(1), char(2), int(4), long(8), float(4), double(8), boolean(1) • 데이터 타입의 첫 번째 목적 • 데이터 타입은 생성할 메모리의 크기(Size)를 지정하기 위한 목적으로 사용한다. • 초보 시절의 데이터 타입 • 단순히 변수를 선언하는 도구 • 언어를 알고 난 후의 데이터 타입 • 메모리를 생성하기 위한 도구
1.2.2 데이터 타입의 두 번째 목적 • 데이터 타입의 두 번째 목적 • 데이터 타입은 메모리의 형태(Type)를 지정하는 목적으로 사용한다. • 메모리의 형태란 비트의 조합을 의미한다. • 4바이트짜리 int형의 메모리 • 정수 형식의 비트조합 • 4바이트짜리 float형의 메모리 • 32비트를 적절하게 잘라서 소수점 이하를 표현하기 위한 실수 형식의 비트조합(지수부, 가수부) • 5와 5.0 • 메모리에 적재될 때 전혀 다르게 표현된다. 5 00000000 00000000 00000000 0000 0101(2) 5.0 01000000 10100000 00000000 00000000(2)
1.2.3 메모리의 크기와 형태 • 데이터 타입의 최종 정의 • 데이터 타입은 메모리의 크기(Size)와 메모리의 형태(Type)를 지정하기 위한 도구이다. • 데이터 타입으로 메모리의 크기와 형태 지정 • int a; //4바이트의 메모리 생성, 정수 형태의 메모리 • char c; //2 바이트의 메모리 생성, 정수 형태의 메모리 • float f; //4바이트의 메모리 생성, 실수 형태의 메모리 • 데이터 타입의 역할 • 프로그래머와 컴파일러 사이의 메모리를 생성하기 위한 규약 • 데이터 타입은 메모리를 생성하기 위한 도구이다.
1.3.1 메모리에 접근하는 방법 • int a; • 데이터 타입으로 메모리 생성 • a는 심볼(Symbol)이다. • 4바이트의 메모리를 생성한 후 이 메모리를 a라는 심볼에 연결시킨다. • a를 사용하게 되면 a가 연결된 내부의 메모리에 작업이 된다. • 변수의 이름 • 몇가지 단순한 규칙만 지킨다면 프로그래머 마음대로 이름을 지을 수 있다. • 변수의 이름을 만드는 방법 • 첫 번째 문자는 영문자나 _(언더바)로 시작해야 한다. • 첫 번째 문자는 숫자로 시작할 수 없다. • 대소문자를 구분한다.(count와 COUNT는 전혀 다른 식별자이다)
1.3.2 변수를 이용한 메모리 접근 • 변수의 선언(4바이트의 메모리 생성) • int a; • 4바이트의 메모리에 값 세팅(할당) • a = 5; • 32비트 정수 5 • 00000000 00000000 00000000 00000101(2) • 자바에는 포인터가 없다. • 자바에서는 포인터를 사용하지 않기 때문에 자바 자체적으로 a의 정확한 주소를 확인할 방법은 없다.
1.3.3 메모리에 들어가는 데이터 • 메모리의 생성 • int a; • char c; • float f; • 메모리에 값할당 • int a; • a = 5; • 상수(Constant) • 상수는 데이터 그 자체를 의미한다. 그렇기 때문에 상수 자체의 값을 변경할 수는 없다. • 오류 • 5 = 100;
1.4.1 데이터 타입의 분류 • 잊지 말아야 할 사항 • 데이터 타입은 메모리의 크기(Size)와 형태(Type)를 지정하는 것이다. char int 정수형 long boolean 데이터 타입 비트조합의 차이에 따른 분류 float 실수형 double
1.4.2 정수형과 실수형 메모리의 형태 • 정수의 메모리 변환법 • 정수(Integral Number) : 5 • 정수형 변환: 00000000 00000000 00000000 0000 0101(2) • 자바에서 사용하는 실수형 비트조합의 규칙 • IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985 • 부동소수점 수의 메모리 변환법 • 부동소수점 수(Floating Point Number): 5.0 • 이진화: 101.0 • 정규화: 1.01 * 2의 2승(1.xxx가 되도록 변환한다) • 부호부: 0(양수) • 지수부: 129 = 2(승) + 127 • 가수부: 01 • 부동 소수점의 비트조합 • float형의 비트(32) = 부호부(1) + 지수부(8) + 가수부(23) • double형의 비트(64) = 부호부(1) + 지수부(11) + 가수부(52) • float형 변환 : 0(부호부) 10000001(지수부) 0100000000000000000000(가수부) • 16진수로 변환: 40 A0 00 00(16)
1.4.3 정수형과 실수형의 계산 • 질문 • 메모리의 사이즈는 같지만 int형 5와 float형 5.0을 컴퓨터 언어에서 아무런 조치 없이 더할 수 있을까? • 기본 데이터 타입의 형변환 • 큰 수와 작은 수를 연산했을 때 큰 수로 형변환된다. • 덜 정밀한 수와 정밀한 수를 연산했을 때 정밀한 수로 형변환된다. • 정수와 실수를 연산했을 때 실수형으로 형변환된다. • 작은 수가 큰 수로 형변환되는 것은 자동이다. • 반대의 경우는 강제 형변환이 필요-오버플로우 발생 • 덜 정밀한 수가 정밀한 수로 형변환되는 것은 자동이다. • 반대의 경우는 강제 형변환이 필요-오버플로우 발생 • 형변환의 예 double d = 3 * 4.5F; • 3 * 4.5F의 결과는 float형이 된다.(정수와 실수의 연산) • float형의 결과가 double d에 할당되면서 float형이 double형으로 자동 형변환된다.
1.4.4 정수형과 실수형 데이터 타입 • 메모리의 비트의 조합은 같으나 메모리의 크기가 다른 정수형 • 바이트(byte) - 1 바이트 • 문자(char) - 2 바이트 • 정수(int) - 4 바이트 • 큰정수(long) - 8 바이트 • byte형 • 자바에서만 사용하는 테이터 타입 • 1바이트짜리 데이터 타입 • 일반적으로 char가 1바이트지만 자바에서는 char형이 유니코드 표현을 위해 2바이트로 바뀌게 된다. 그래서 자바에서 1바이트 데이터 타입을 위해서 새롭게 만든 데이터 타입 • 문자의 표현 • 'a', 'A' 는 숫자이다. • 메모리의 비트의 조합은 같으나 메모리의 크기가 다른 실수형 • 덜 정밀한 실수형(float) : 4 바이트 • 정밀한 실수형(double) : 8 바이트
1.4.5 그 외 데이터 타입 • 불린형 • 1바이트 boolean • 정수형 • 1바이트 byte • 2바이트 short • 4바이트 int • 8바이트 long • 2바이트 char • 실수형 • 4바이트 float • 8바이트 double • 자바에서의 unsigned • 자바에서는 모든 데이터 타입이 singed이다. unsigned 계열의 데이터 타입은 지원하지 않는다.
1.5.1 데이터 타입의 목적 • 데이터 타입으로 할 수 있는 일 • 메모리를 생성하는 일 • 데이터 타입으로 메모리를 생성하는 방법 • 변수를 통해서 가능하다. • 변수의 선언은 메모리의 생성을 의미한다. • 데이터 타입의 목적 • 테이터 타입으로 변수를 만들 수 있다. • 데이터 타입과 변수의 관계 • 변수를 만들기 위해서는 반드시 데이터 타입이 필요하다.
1.5.2 변수의 의미 • 변수(Variable) • 변수란 데이터 타입에 명시된 형태의 데이터를 담을 수 있는 메모리이다. • 변수와 데이터 타입의 관계 • 변수는 데이터 타입을 통해서 존재할 수 있다. • 변수(Variable)의 목적 • 변수를 만드는 이유는 데이터를 보관하기 위해서이다. • 변수(Variable)의 이름 • 변수의 이름은 해당 메모리를 핸들할 수 있는 유일한 수단이다. • 변수(Variable)에 값할당 • 변수에는 데이터 타입에 맞는 형의 데이터를 넣어야 한다.
1.5.3 상수의 의미 • 상수(Constant) • 상수는 데이터 그 자체를 말하며 바꿀 수 없는 데이터를 말한다. • 정수형 상수의 구분 • 100 : 명시하지 않으면 int형 상수 • 100L, 100l : long형 상수 • 실수형 상수의 구분 • 5.34 : 명시하지 않으면 double형 상수 • 5.34F, 5.34f : float형 상수 • 5.34D, 5.34d : double형 상수 • 문자 상수의 예 • 'A', 'a' • 문자열 상수의 예 • "abcd" • 마지막에 널문자('\0')가 자동으로 추가된다. • "abcd"라는 문자열은 10바이트의 메모리를 차지한다.
1.6.1 데이터 타입과 변수, 상수 • int a = 3; • 데이터 타입 int • 변수 a • 상수 3 • 할당(Assignment) • 할당이란 변수에 값을 집어넣는 행위를 말한다. 메모리의 크기와 형태를 구분짓는 데이터 타입 데이터를 담을 수 있는 그릇 데이터 그자체
1.6.2 할당의 법칙 • = 연산자 • = 연산자는 데이터 타입에 맞는 값을 할당하라는 의미를 담고 있다. • 할당의 법칙 • 오른쪽에서 왼쪽으로만 할당이 가능하다.(절대적) • 변수끼리도 할당이 가능하다.(오른쪽에서 왼쪽으로 할당) • 변수에 이미 상수가 존재하더라도 다른 것을 할당하면 마지막에 넣은 것이 최종적으로 할당된다. • 선언과 동시에 초기화 • int a = 100; • 선언과 할당의 분리 • int a; • a = 100; • 여러 개를 선언함과 동시에 초기화 • int a = 100, b = 200; • 여러 개를 선언한 후 할당 • int a, b; • a = 100; • b = 200; • 변수끼리의 할당 • int a = 100; • int b; • b = a;
1.6.3 할당의 예 • 할당의 예 • int sum = 100; • sum = sum + 200; • 할당 예제 • public class SumMain { • public static void main(String[] args) { • int sum = 0; • for (int i=0; i<100; i++) { • sum = sum + i; • } • System.out.println("sum은 :" + sum); • } • } 오른쪽부터 먼저 계산이 된 후 왼쪽으로 할당된다.
1.7.1 결론 • 핵심 Question 해답 • 데이터 타입은 메모리지도이다. • 데이터 타입은 메모리를 생성하는 도구이다. • 데이터 타입은 크기(사이즈)가 있다. • 데이터 타입은 타입(형태)이 있다. • 데이터 타입으로 변수를 만든다. • 변수의 선언은 메모리 생성을 의미한다. • 변수에는 상수를 할당할 수 있다. • 핵심주제 • 데이터 타입을 알면 클래스가 쉬워진다. • 필자의 경험 • 필자는 클래스를 이해하던 날이 데이터 타입을 완전히 이해하던 날이었다. 이것에 대한 해답을 찾았길 바란다.
2 2 ███████████
3rd Edition 소설같은 자바 since 2001 최 영 관 Powered by http://www.jabook.org 2장 클래스의 기본
2.1.1 핵심 Question • 목표 • 클래스의 개념을 이해하자. • 핵심 Question • 구조체는 xxx xx xxx이다. • 구조체로 xxx xx을 만들 수 있다. • 구조체로 만든 xxx xx은 xxx xx이다. • 구조체로 만든 xxx xx으로 xx를 만들 수 있다. • 클래스는 xxx xx xxx이다. • 클래스로 xxx xx을 만들 수 있다. • 클래스로 만든 xxx xx은 xxx xx이다. • 클래스로 만든 xxx xx으로 xx를 만들 수 있다. • 클래스의 개념 • 2장을 읽고 클래스의 개념을 깨우친다면 자바를 절반은 정복한 것이다. 이 문제의 해답을 찾는다면 클래스의 개념을 깨우칠 수 있을 것이다.
2.1.2 기본 데이터 타입의 한계 • 기본 데이터 타입의 한계 • 기본 데이터 타입으로 변수를 생성했을 때 생성된 변수에는 하나의 데이터만 보관할 수 있다. • 정해진 데이터 타입만을 사용해야 한다. • 기본 데이터 타입 변수에 여러 번 값할당 • int s = 100; • s = 200; • s = 300; • 구조체 • 동시에 여러 개의 데이터를 담을 수 있는 데이터 타입을 사용자가 직접 만들어서 사용하는 사용자 정의 데이터 타입 • 클래스 • 자바에서는 구조체가 발전해서 클래스가 된다. 구조체 클래스 발전 C 언어 객체지향 언어(C++, Java)
int age float height float weight 2.1.3 구조체 만들기 • C 언어에서의 Person 구조체 선언 • struct Person{ • int age; • float height; • float weight; • }; • Person 구조체의 분석 • struct : 구조체를 만드는 키워드 • Person : 구조체로 만들어진 새로운 데이터 타입 • int age : Person 내부의 멤버 • float height : Person 내부의 멤버 • float weight : Person 내부의 멤버 • 구조체란? • 기본 데이터 타입의 한계를 극복하기 위해서 C 언어에서 제공되는 데이터 타입 생성기 • 구조체로 만든 사용자 정의 데이터 타입 • 구조체로 만든 사용자 정의 데이터 타입 Person은 메모리의 크기와 형태를 지정하는 데이터 타입이다. • Person 구조체의 메모리의 크기와 메모리의 형태 • Person 데이터 타입의 크기 = 4(int) + 4(float) + 4(float) • Person 데이터 타입의 형태 = int + float + float Person의 메모리 지도 4bytes 12bytes 4bytes 4bytes
2.1.4 구조체의 사용 • Person 구조체 • struct Person{ • int age; • float height; • float weight; • }; • 구조체 변수의 선언 • struct Person sister; // C 언어 방식의 구조체 선언 변수 • Person brother; // C++ 언어 방식의 구조체 선언 변수 • 구조체의 값 할당 • Person sister; • sister.age = 15; • sister.height = 165.3F; • sister.weight = 51.0F; • Person brother; • brother.age = 20; • brother.height = 170.0F; • brother.weight = 67.5F;
2.1.5 클래스로 가는 길목 • 질문 • 왜 이렇게 구조체의 의미를 상세히 다루는 것일까? • 구조체가 중요한 이유 • 구조체가 클래스의 할아버지뻘 정도 되기 때문이다. • 구조체는 클래스의 기본 개념을 포함하고 있다. • 구조체를 제대로 안다면 자바의 클래스를 쉽게 이해할 수 있다. • 클래스가 없던 시절 • 구조체와 메서드가 클래스의 모든 작업을 대행하였다. 구조체 클래스 + 메서드
2.2.1 클래스 만들기 • C 언어 - Person 구조체 선언 • struct Person{ • int age; • float height; • float weight; • }; • Person 클래스 - 새로운 데이터 타입 • public class Person { • public int age; • public float height; • public float weight; • } • Person 클래스의 분석 • class : 클래스를 선언하는 키워드 • Person : 새로운 데이터 타입의 이름 • age : 데이터 타입 내의 멤버 • height : 데이터 타입 내의 멤버 • weight : 데이터 타입 내의 멤버 • 구조체와 클래스 • public을 모두 제거하고 class 키워드를 struct로 바꾼다면, 모든 면에서 구조체와 동일하다.
2.2.2 클래스의 사용 • 자바의 변수 선언 • Person brother; • 클래스 변수의 특징 • 클래스로 변수를 선언해도 메모리가 생성되지 않는다. • 클래스는 변수를 선언한 후 별도의 메모리 생성 과정을 거쳐야 한다. • 클래스 변수의 선언과 메모리 할당의 분리 • Person brother; //변수의 선언 • brother = new Person(); //메모리의 생성 • 클래스 변수의 선언과 메모리 할당을 동시에 • Person brother = new Person(); • 클래스 변수의 선언과 값 할당 • Person brother = new Person(); • brother.age = 20; • brother.height = 170.0F; • brother.weight = 67.5F; • 클래스 변수 • 클래스로 변수를 만들어도 이것을 변수라고 부른다. 기본 데이터 타입의 변수와 구별하기 위해서 클래스 변수를 객체 또는 객체 변수라고 부른다. • Person sister = new Person(); • sister.age = 15; • sister.height = 165.3F; • sister.weight = 51.0F;
2.2.3 메모리 생성 연산자 • 구조체의 선언과 메모리 생성 • Person brother; • Person sister; • 클래스의 선언과 메모리 생성 • Person brother = new Person(); • Person sister = new Person(); • 구조체의 메모리 생성 • 구조체는 변수의 선언과 동시에 메모리가 생성된다. • 기본 데이터 타입의 메모리 생성 • 기본 데이터 타입은 변수의 선언과 동시에 메모리가 생성된다. • 클래스 변수의 메모리 생성 • 클래스로 변수만 선언했을 때 메모리가 생성되지 않는다. • 메모리를 생성하기 위해서는 반드시 new와 생성자를 함께 사용해야 한다.
2.2.4 사용자 정의 데이터 타입 테스트 • 자바 코드의 파일명과 확장자 • 클래스의 이름과 파일명은 동일하다. • 소스 파일은 .java 확장자를 사용한다. • 클래스 파일 • 코드를 컴파일하면 클래스명과 동일한 .class 파일이 생성된다. • 즉 컴파일된 결과 파일은 .class 확장자가 붙는다. • main()을 포함한 클래스가 실행 클래스가 된다. • 각각의 파일 컴파일하기 • javac Person.java • javac PersonMain.java • 한번에 컴파일 하기 • javac P*.java • 자바 프로그램의 실행 • java PersonMain • Person 클래스 - 새로운 데이터 타입 • public class Person { • public int age; • public float height; • public float weight; • } Person.java Person 클래스를 테스트하는 예 public class PersonMain { public static void main(String[] args) { Person brother = new Person(); brother.age =100; brother.height = 170.0F; brother.weight = 67.0F; System.out.println("age:" + brother.age); System.out.println("height:" + brother.height); System.out.println("weight:" + brother.weight); } } PersonMain.java
2.3.1 클래스와 데이터 타입의 관계 • 데이터 타입, 변수, 상수의 관계 • 데이터 타입 : 무존재(無存在) • 변수 : 존재(存在) • 상수 : 실존(實存) • 구조체와 클래스의 위치 • 데이터 타입 윗부분에 구조체와 클래스가 위치한다. • 데이터 타입, 변수, 상수의 관계 • 클래스, 구조체 : 무(無) • 데이터 타입 : 무존재(無存在) • 변수 : 존재(存在) • 상수 : 실존(實存) • 구조체와 클래스의 역할 • 구조체와 클래스는 둘 다 데이터 타입 생성기이다. 데이터 타입 생성기 데이터 타입 변수 상수
2.3.2 자바에서 사용하지 않는 구조체 • 구조체 • C 언어의 사용자 정의 데이터 타입 • 클래스 • C++와 자바에서의 사용자 정의 데이터 타입 • 자바에서 구조체 • 자바에는 구조체가 없다. • 구조체에서 발전된 개념이 클래스이다. • 결론 • 클래스는 구조체의 개념을 포함한다. C 언어 구조체 클래스 구조체 클래스 Java 언어 C++언어
2.3.3 클래스의 역할 • 인간 클래스 디자인 • class Person{ • int age; • float height; • float weight; • 등등… • } • Person 홍길동 = new Person(); • Person 성춘향 = new Person(); • Person 홍길동 = new Person(); • 홍길동.age = 20; • 홍길동.height = 180.0F; • 홍길동.weight = 80.0F; • Person 성춘향 = new Person(); • 성춘향.age = 16; • 성춘향.height = 164.0F; • 성춘향.weight = 50.0F;
2.3.4 클래스와 데이터베이스 • 데이터베이스 테이블에 비유되는 Person 클래스 • public class Person{ • public int age; • public float height; • public float weight; • } □ Person 테이블에 레코드 삽입(MS-SQL 2000 기준) ◇ insert into Person values (20, 170.0, 67.5); ◇ insert into Person values (15, 165.3, 51.0); □ Person 테이블 생성 구문(MS-SQL 2000 기준) ◇ Create Table Person (age int, height float, weight float); • 레코드 삽입에 비유되는 객체의 값할당 • Person 홍길동 = new Person(); • 홍길동.age = 20; • 홍길동.height = 170.0F; • 홍길동.weight = 67.5F; • Person 성춘향 = new Person(); • 성춘향.age = 15; • 성춘향.height = 165.3F; • 성춘향.weight = 51.0F;
2.3.5 클래스와 메모리 • Person 클래스의 구성 • Person이라는 데이터 타입의 근본은 변수로 이루어져 있으며, 여러 개의 변수를 조합해서 하나의 데이터 타입을 이루고 있다. • Person 클래스 내의 변수들의 역할 • 메모리를 어떻게 분할할 것인지를 나타낸다. • Person 클래스 • public class Person{ • public int age; • public float height; • public float weight; • } • Person의 메모리 생성 • Person p = new Person(); • Person p의 메모리 • □□□□ □□□□ □□□□ 클래스가 변수로 되어 있는 이유 5번째부터 4개의 바이트에 float형의 데이터를 넣고자 한다면, 해당 부분이 아예 처음부터 변수로 되어 있으면 편하다.