(C#) 이것이 C#이다 chapter 3 연습문제
1. 다음 코드에서 잘못된 부분을 찾고, 그 이유를 설명하라.
int a = 7.3; // 컴파일 에러
float b = 3.14; // 컴파일 에러
double c = a * b; // a,b가 위에서 선언되어 있으므로 문제 없음
char d = "abc"; // 컴파일 에러
string e = '한'; // 컴파일 에러
1-1. int는 정수형식이기때문에 소수점 부분이 절삭됩니다. c#에서는 컴파일 에러를 일으킵니다.
int a = (int)3.14;
Console.WriteLine(a);
이런 방식으로 강제해줘도 소수점 부분은 절삭되고 3이라고만 출력됩니다.
1-2. float은 소수점 뒤에 f를 붙여야합니다.
float b = 3.14f;
var bb = 3.14;
Console.WriteLine("{0}", bb.GetType()); // bb의 타입을 가져옴
// 출력 결과 System.Double 이라고 출력됨
f를 붙이지 않고 3.14 라고만 쓰면 기본적으로 double로 인식하게 됩니다. 2,3번 라인의 var bb를 통해 테스트 한것 (p.60 참고)
1-3. char형식은 문법적으로 ' '을 사용해야합니다.
또한 ' '을 사용한다고 해도 너무 많은 문자를 담고있습니다.
char d = 'abc'; // 컴파일 에러
Console.WriteLine(d);
char 형식(2바이트 크기)은 'a', 'b', 'c','가','나','다' 와 같이 한글자를 담을 수 있습니다.
영어는 한글자에 1바이트, 한글은 2바이트 입니다. 그러나 영문도 한글자만 담을 수 있습니다.
char a = 'a';
char b = '가';
1-4. string형식은 문법적으로 " "을 사용해야합니다. ex : "한"
string a = "한";
string b = "스트링";
2. 값 형식과 참조 형식의 차이점은?
값 형식은 스택 영역의 메모리에 데이터가 저장된다.
참조는 해당 데이터는 힙 영역의 메모리에 저장되고, 스택 영역의 메모리에는 데이터가 저장되어 있는 힙 메모리의 주소가 저장된다. (p.45)
3. 박싱과 언박싱을 설명하라.
박싱 : object 형식(참조 형식)에다가 (값 형식)의 데이터를 할당하려는 시도가 이루어지면 object 형식은 해당 데이터를 힙 영역에 저장함.
언박싱 : 박싱되어있는 값(힙 영역)을 꺼내 값 형식 변수(스택 영역)에 저장하는 과정
4. 다음과 같이 사용자로부터 사각형의 너비와 높이를 입력받아 넓이를 계산하는 프로그램을 완성하세요. 다음 코드 중 주석 부분을 바꾸면 됩니다.
사각형의 너비를 입력하세요.
30
사각형의 높이를 입력하세요.
40
사각형의 넓이는 : 1200
using System;
namespace RectArea {
class MainApp
{
public static void Main(){
Console.WriteLine("사각형의 너비를 입력>");
string width = Console.ReadLine();
Console.WriteLine("사각형의 높이를 입력>");
string height = Console.ReadLine();
// 이 곳에 사각형의 넓이를 계산하고
// 출력하는 루틴을 추가하세요.
}
}
}
문제점
1. string 방식끼리 곱할 수 없습니다.
Console.WriteLine("사각형의 너비를 입력>");
string w = Console.ReadLine();
Console.WriteLine("사각형의 높이를 입력>");
string h = Console.ReadLine();
string area = w * h; // 컴파일 에러
2. ReadLine() 함수 사용
처음에 왜 string을 사용했는지 몰랐습니다.
그냥 너비와 높이를 double이나 int형태로 받는게 낫지 않을까 할 수 있겠지만
ReadLine()함수를 사용하고자 한다면 그럴 수 없습니다.
ReadLine()함수는 기본적으로 string을 반환하기 때문입니다.
(https://docs.microsoft.com/ko-kr/dotnet/api/system.console.readline?view=netframework-4.8)
Console.WriteLine("사각형의 너비를 입력>");
double w = Console.ReadLine(); // 컴파일 에러
이런 방식은 오류가 나므로 string으로 입력받고 이를 숫자 형태로 바꿔줘야 합니다.
해답 :
using System;
namespace RectArea {
class MainApp
{
public static void Main()
{
Console.WriteLine("사각형의 너비를 입력>");
string w = Console.ReadLine();
Console.WriteLine("사각형의 높이를 입력>");
string h = Console.ReadLine();
double width = double.Parse(w);
double height = double.Parse(h);
double area = width * height;
Console.WriteLine("넓이는 : {0}", area);
}
}
}
Parse() 함수를 이용해 string 문자열을 double형식으로 바꿔주었습니다. (p.76 참고)
'Computer Language > C#' 카테고리의 다른 글
이것이 C#이다 공지사항 (0) | 2019.08.18 |
---|