//출력
// 줄바꿈
{
    Console.WriteLine("Hello World!");
    Console.WriteLine("My Name is Ju");

    Console.WriteLine(10);
    Console.WriteLine(3.141592);
    Console.WriteLine(3 + 3);
}

// 한줄 출력
{
    Console.Write("Hello! ");
    Console.Write("We are Learning ");
    Console.WriteLine("at TeamSparta");
}

// 입력
{
    Console.Write("Enter your name: ");
    string name = Console.ReadLine();
    Console.WriteLine("Hello, {0}!", name);
}


// Split 함수 문자열 나누기 + 형변환
{
    Console.Write("Enter two numbers: ");
    string input = Console.ReadLine();    // "10 20"과 같은 문자열을 입력받음
    // { "10", "20" }
    string[] numbers = input.Split(' ');  // 문자열을 공백으로 구분하여 배열로 만듦
    int num1 = int.Parse(numbers[0]);     // 첫 번째 값을 정수로 변환하여 저장
    int num2 = int.Parse(numbers[1]);     // 두 번째 값을 정수로 변환하여 저장

    int sum = num1 + num2;                // 두 수를 더하여 결과를 계산

    Console.WriteLine("The sum of {0} and {1} is {2}.", num1, num2, sum);
}


// var 키워드
{
    var num = 10;         // int 자료형으로 결정됨
    var name = "kero";   // string 자료형으로 결정됨
    var pi = 3.141592;    // double 자료형으로 결정됨
}


// 산술 연산자
{
    int num1 = 20, num2 = 10;

    Console.WriteLine(num1 + num2);
    Console.WriteLine(num1 - num2);
    Console.WriteLine(num1 / num2);
    Console.WriteLine(num1 * num2);
    Console.WriteLine(num1 % num2);
}

// 관계 연산자
{
    int num1 = 20, num2 = 10;

    Console.WriteLine(num1 == num2);
    Console.WriteLine(num1 != num2);
    Console.WriteLine(num1 > num2);
    Console.WriteLine(num1 < num2);
    Console.WriteLine(num1 >= num2);
    Console.WriteLine(num1 <= num2);
}

// 논리 연산자
{
    int num3 = 15; 
    0 <= num3 <= 20

    Console.WriteLine(0 <= num3 && num3 <= 20); // 0과 20 사이에 포함되면
    Console.WriteLine(0 > num3 || num3 > 20); // 0 ~ 20 사이에 포함되지 않으면

    Console.WriteLine(!(0 <= num3 && num3 <= 20)); // 0과 20 사이에 포함되어있지 않으면
}


// 비트 연산자
{
    int a = 0b1100; // 12 (2진수)
    int b = 0b1010; // 10 (2진수)

    int and = a & b; // 0b1000 (8) 두 비트 값이 모두 1일 때 1을 반환
    int or = a | b; // 0b1110 (14) 두 비트 값 중 하나라도 1일 때 1을 반환
    int xor = a ^ b; // 0b0110 (6) 두 비트 값이 서로 다를 때 1을 반환
    int not = a; // 0b0011 비트 값의 보수(complement)를 반환

    int c = 0b1011; // 11 (2진수)
    int leftShift = c << 2; // 0b101100 (44) 비트를 왼쪽으로 이동
    int rightShift = c >> 1; // 0b0101 (5) 비트를 오른쪽으로 이동

    int d = 0b1100; // 12 (2진수)
    int bit3 = (d >> 2) & 0b1; // 0 (3번째 비트)
    d |= 0b1000; // 0b1100 | 0b1000 = 0b1100 (12)
}

// 연산자 우선순위
{
    1.괄호(): 괄호로 감싸진 부분은 가장 높은 우선순위로 먼저 계산됩니다.
    2.단항 연산자: 단항 연산자들(++, --, +, -, !등)은 괄호 다음으로 높은 우선순위를 가집니다.
    3.산술 연산자: 산술 연산자들(*, /, %, +, -)은 단항 연산자보다 우선순위가 낮습니다.
    4.시프트 연산자: 시프트 연산자(<<, >>)는 산술 연산자보다 우선순위가 낮습니다.
    5.관계 연산자: 관계 연산자들(<, >, <=, >=, ==, !=)는 시프트 연산자보다 우선순위가 낮습니다.
    6.논리 연산자: 논리 연산자들(&&, ||)는 관계 연산자보다 우선순위가 낮습니다.
    7.할당 연산자: 할당 연산자들(=, +=, -=, *=, /= 등)는 논리 연산자보다 우선순위가 낮습니다.
}


// 문자열 처리 기능 메서드
// 문자열 생성
{
    string str1 = "Hello, World!"; // 리터럴 문자열 사용
    string str2 = new string('H', 5); // 문자 'H'를 5개로 구성된 문자열 생성
}

// 연결 - 포멧팅을 더 자주 사용한다
{
    string str1 = "Hello";
    string str2 = "World";
    string str3 = str1 + " " + str2;
}

// 분할
{
    string str = "Hello, World!";
    string[] words = str.Split(','); // str 문자열을 쉼표(,)로 구분
}

// 검색
{
    string str = "Hello, World!";
    int index = str.IndexOf("World"); // str 문자열에서 "World" 문자열의 첫 번째 인덱스를 찾아 index 변수에 저장
}

// 대체
{
    string str = "Hello, World!";
    string newStr = str.Replace("World", "Universe"); // str 문자열에서 "World" 문자열을 "Universe" 문자열로 대체한 새로운 문자열 newStr을 생성
}

// 변환
{
    string str = "123";
    int num = int.Parse(str);
}
{
    int num = 123;
    string str = num.ToString();
}

// 비교
{
    string str1 = "Apple";
    string str2 = "Banana";
    int compare = string.Compare(str1, str2); // 사전식 비교. str1이 str2보다 작으면 음수, 크면 양수, 같으면 0이 나온다.
}

// 포멧팅
// 형식화
{
    string name = "John";
    int age = 30;
    string message = string.Format("My name is {0} and I'm {1} years old.", name, age);
}
//보간
{
    string name = "John";
    int age = 30;
    string message = $"My name is {name} and I'm {age} years old.";
}

 

 

Parse랑 Convert의 차이

파싱 실패했을 때, Parse는 FormatException을 내보내고 Convert는 기본값(int같은 경우 0)을 내보낸다.즉, Parse는 예외처리가 되고 Convert는 안된다. 데이터가 항상 명확하고 원하는 값이라면 Parse를 사용하고 불확실할 때는 Covert를 사용한다.

변수

 

변수를 선언하고 초기화한다.

int x; // 선언
x = 123; // 초기화

int y = 321; // 선언 + 초기화

int z = x + y;

Console.WriteLine(x);
Console.WriteLine(y);
Console.WriteLine(z);

 

변수의 기본 자료형

int age = 4; // 정수
double height = 315.5; // 실수
bool alive = false; // true or false 논리형
char symbol = '@'; // 정수와 단일문자 표시
String name = "Rabbit"; // 문자

Console.WriteLine("Hello " + name);
Console.WriteLine("My age is " + age);
Console.WriteLine("My height is " + height + "cm");
Console.WriteLine("Am I alive? " + alive);
Console.WriteLine("My symbol is: " + symbol);

String userName = symbol + name;

Console.WriteLine("Your username is: " + userName);

 

'C# > C#' 카테고리의 다른 글

06. 산술 연산자(Arithmetic Operator)  (0) 2023.08.21
05. 입력(Input)  (0) 2023.08.18
04. 형변환(Type Casting)  (0) 2023.08.17
03. 상수(Constants)  (0) 2023.08.16
01. 출력(Output)  (0) 2023.08.15
변수(Variables)

데이터가 저장되는 공간

 

변수의 특징

  • 1개의 변수에는 1개의 값만 할당 할 수 있다.
  • 변수에 지정된 값은 재할당을 통해 변경 가능하다.
  • 값의 형태에 맞는 자료형을 사용해야한다. 예) String = 1234; (x) 
  • 변수명은 소문자로 시작해야한다.
  • 대소문자를 구분해야하며 공백은 포함이 불가능하다.
  • 자바 예약어(int, double, String 등)는 변수로 사용할 수 없다.

공백을 사용해야 할 때는 대문자를 사용하여 구분한다.이러한 방법을 카멜 케이스(Camel Case)라고 한다. 예) int productPrice = 10000;

 

 

데이터 타입

기본형(PrimitiveType)

정수형

  • byte(1 byte - 8 bits) : -2^7 ~ 2^7-1(-128 ~ 127)의 범위를 나타낼 수 있다.
  • short(2 bytes) : -2^15 ~ 2^15-1(-32,768 ~ 32,767)의 범위를 나타낼 수 있다.
  • int(4 bytes) : -2^31 ~ 2^31-1의 범위를 나타낼 수 있다.
  • long(8 bytes) : -2^63 ~ 2^63-1의 범위를 나타낼 수 있다.

일반적으로 많이 사용하는 정수형 데이터는 int 타입이며, 보통 long 타입은 웹서비스나 웹 애플리케이션을 만들 때 객체 각각의 고유한 값을 가지는 아이디를 만들 때 사용된다.

 

실수형

  • double(8 bytes) : 소수점 15자리까지의 정밀도
  • float(4 bytes) : 소수점 7자리까지의 정밀도

float 데이터를 다룰 때 뒤에 f를 붙여야하는 번거로움이 있기 때문에 일반적으로 실수형 데이터를 표현할 때에는 double 타입을 사용한다.

 

문자형

  • char(2 bytes) : 작은따옴표('')를 사용한다.

문자열은 말 그대로 문자를 나열한 것이고 문자형 데이터는 문자 한 개만 다룰 수 있는 데이터 타입이다. 정수를 입력하면 아스키(ascii)코드로 변환되어 나온다. 그 외에도 16진수 형태의 유니코드를 입력하여도 문자형으로 출력된다.

 

논리형

  • boolean(1 byte)

참거짓(True, False) 값. 불, 불린, 불리언 등으로 불린다. 참과 거짓 외에도 논리적으로 판단할 수 있는 표현식을 넣어도 된다. 

 

 

참조형(Reference Type)

참조형 데이터의 값 => 힙 메모리

변수에 대입되는 값 => 힙 메모리 영역의 주소값

 

참조형 데이터 타입은 원칙적으로 new 연산자를 이용하여 객체를 구성하는 방식이다.

String = new String(original: "Hello!");
System.out.printIn(a);

참조형 데이터의 값을 나타내는 부분(Hello!)은 변수 a가 아닌 힙 메모리 영역에 생성된다. 변수(a)에 대입되는 실제 값는 힙 메모리 영역의 주소값이 대입된다. 즉, a는 힙 메모리의 어느 곳에 Hello!라는 문자열이 있는지 주소만 가지고 있을 뿐 값을 가지고 있는 것은 아니다. 

그래서 String 같은 경우, new 연산자를 활용하지 않고 값 자체를 변수에 대입하여 사용한다. 이를 리터럴(Literal) 방식이라고 한다.

String b = "Hello!";

그럼 a와 b의 값은 같은 주소 값을 가지고 있을까?

if (a == b) {
	System.out.printin("a == b");
}

결과는 아니다. 같은 Hello!라는 값이어도 a라는 변수, b라는 또다른 변수를 선언했기 때문이다.

같은 값으로 또다른 변수를 선언하여 비교해보자.

String c = "Hello!";
if (b == c) {
	System.out.printin("a == b");
}

그런데 이번에는 b와 c가 힙 메모리에 같은 데이터를 가르키고 있다고 나온다.

리터럴 방식으로 문자열을 대입하면 기존에 힙 메모리에 동일한 값이 있는지 먼저 확인한다. 그리고 동일한 값이 있으면 새롭게 그 객체를 힙 메모리에 만들지 않고 기존의 주소를 가져간다. new 연산자 방식은 new 연산자를 새로 만드는 작업만 한다. 그렇기 때문에 기존에 같은 문자열 데이터가 있든 없든 무조건 새로 생성한다.

 

 

상수(Constants, final variables)

변수와 상반되는 개념

 

상수의 특징

  • 한 번 값이 할당되면 이후에 재할당이 불가능하다.
  • 전체를 대문자로 표시하고 단어간 구분은 _로 한다.

프로그램 내에서 한 번이라도 변경이 필요한 값들은 상수로 선언하면 안된다. 공통적으로 값을 곱해주어야한다던지, 공식 같은 로직에서만 사용해야한다.

 

 

'Back-End > Java' 카테고리의 다른 글

연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
String 문자열  (2) 2023.05.09
형변환  (0) 2023.05.08
Java란?  (0) 2023.05.02

+ Recent posts