//출력
// 줄바꿈
{
    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를 사용한다.

파이썬은 별도의 세미콜론( ; )이 필요없이 개행하면 소스가 새로 시작한다는 의미이다.

 

데이터를 반복적으로 활용하거나 원하는 형식으로 조절하기 위해서는 데이터를 공간에 넣어야한다. 그러기 위해서는 변수를 선언해야한다.

# greeting이라고 하는 변수 선언
# 이 변수에 문자열 값을 할당
greeting = "안녕하세요:)"
print(greeting)

# 변수는 데이터를 변경해서 할당할 수 있는 공간
greeting = "반갑습니다:)"
print(greeting)

 

파이썬에서의 변수의 특징

  • 변수 사이에 공백 허용되지 않음
  • 단어 사이는 _(언더스코어)를 사용하여 연결
  • 변수를 선언하기 위한 문자열은 숫자/특수문자로 시작이 불가
  • 예약어 사용 불가
  • 가급적 소문자 사용
  • 오타 주의

 

문자열(Strings)

문자의 나열

 

대소문자 변환

city = "seoul" # Seoul, SEOUL, SEOul
print(city)

# 대문자
city.upper()
print(city.upper())

city = city.upper()
print(city)

# 소문자
city.lower()
print(city.lower())

city = city.lower()
print(city)

 

공백 제거

occupation = "   developer   "
print(occupation)

# 우측 공백 제거
occupation.rsplit()
print(occupation.rsplit())

# 좌측 공백 제거
occupation.lstrip()
print(occupation.lsplit())

# 양옆 공백 제거
occupation.strip()
print(occupation.split())

 

개행 및 공백

print("INFP\nENFP\nISTJ\nESTJ")
print("INFP\tENFP\tISTJ\tESTJ")

 

시작과 끝 제거

# 시작 제거
score = "점수:90"
print(score.removeprefix("점수:"))

# 끝 제거
score_2 = "75점"
print(score_2.removesuffix("점"))

 

수정

city = "서울 중구"
print(city.replace("서울", "서울시"))

 

f-string

si_1 = "용인"
gu_1 = "기흥"
address_1 = f"{si_1}시 {gu_1}구"
print(address_1)

si_2 = "서울"
gu_2 = "종로"

# 서울시 종로구
# 용인시 기흥구
# (시의 이름)시 (구의 이름)구
print(f"{si_1}시 {gu_1}구")
print(f"{si_2}시 {gu_2}구")

 

 

숫자(numbers)

 

정수의 계산

a = 2
b = 3

print(a + b) # 더하기
print(a - b) # 빼기
print(a * b) # 곱하기
print(a / b) # 나누기

print(a ** b) # 제곱

print(a + b * b)
print((a + b) * b) # 괄호

print(a // b) # 몫
print(a % b) # 나머지

 

실수(Float)의 계산

실수와 연산하는 수는 그 결과가 모두 실수이다.

x = 10.0
y = 0.3
z = 1

print(x - y)
print(x + y)
print(x * y)
print(x / y)

print(x + z)
print(x - z)
print(x * z)
print(x / z)

 

숫자 표현

# 언더스코어(_)
price = 12_349_000_000_000
print(price)

 

상수(contants)

상수로 선언된 변수는 재할당 되어서는 안된다.

PI = 3.141592

 

문자열 - 숫자 간의 변환

a = 100
b = "100"
c = "0.453"

a = str(a) # 문자열
b = int(b) # 숫자
c = float(c) # 실수

 

 

논리형(Bool, Boolean)

다른 언어들과 달리 파이썬에서는 불 값이 대문자로 시작한다.

print(3 > 2) # True
print(3 == 3) # True
print(3 == 3.0) # True
print(3 is 3.0) # False

 

 

명령 프롬프트

CLI에 텍스트를 입출력하는 방법

input("설치를 계속 진행하시겠습니까? (y/n): ")

text = input("출력할 텍스트를 입력해주세요: ")
print(text)

 

 

 

주석

주석을 사용하는 이유

  • 테스트를 위해 코드를 임시로 무효화 하기 위해서
  • 함수, 변수 등의 의미를 다른 개발자들과 협업을 위해 공유하기 위해서
  • 프로그램을 유지보수하고 체계적인 프로젝트 관리를 위해서

 

주석 사용법

# 한 줄 주석입니다.

"""
여러 줄 주석입니다.
여러 줄 주석입니다.
여러 줄 주석입니다.
"""

'''
여러 줄 주석입니다.
print{"test"}
'''

 

 

String

문자열 객체

 

객체 => 힙 메모리 영역

변수 => 힙 메모리 영역의 주소

String str = "안녕하세요!"; // 문자열 리터럴

"안녕하세요!"라는 값 자체는 힙 메모리 영역에 저장되고 str 변수에는 힙 메모리 영역의 주소가 할당된다.

String의 경우, 자바에서 값 자체를 할당할 수 있도록 지원해주기 때문에 위처럼 사용이 가능하다. 그러나 일반적으로 자바의 객체는 리터럴(Literal), 값 자체를 대입 할 수 없다.

String str_2 = new String(original: "안녕하세요!"); // 생성자

원칙적으로는 new 연산자를 이용하여 새로운 객체를 생성하겠다고 선언한 뒤, 객체의 종류, 파라미터 영역에 어떤 데이터를 만들지 적어야한다.

이전의 변수와 자료형, 그리고 상수 포스팅의 참조형에서 말했다시피 변수에 직접 대입한 값과 생성자를 이용하여 만든 값은 값이 같아도 같은 주소를 공유하지 않는다.

그렇다면 주소가 아니라 값 자체는 동일하다고 받아들일까?

if (str.equals(str_2)) {
    System.out.println("str.equals(str_2)");
}

결과는 참이다. 즉, 주소가 아닌 값 자체를 비교할 때에는 equals 메소드를 통해 비교하면 된다.

 

 

문자열 병합

1. '+' 연산자 활용

String str_1 = "Hello,";
String str_2 = "World!";

System.out.println(str_1 + " " + str_2);

공백은 str_1 변수나 str_2 변수에 넣어도 된다.

'+' 연산자는 하나를 합칠 때마다 임시로 String 객체를 만들어서 붙여서 반환하는 형태이다. 그런데 임시로 객체를 할당한다는 것은 힙 메모리를 사용한다는 것이다. 용량은 작지만 메모리에 영향이 있는 것은 사실이다.

 

2. StringBuilder 활용

StringBuilder strBdr_1 = new StringBuilder("Hello,");

strBdr_1.append(" ");
strBdr_1.append("World!");

String str_new = strBdr_1.toString();
System.out.println(str_new);

'+' 연산자를 사용할 때는 임시 객체를 만들어서 문자열을 붙였다. StringBuilder를 활용하면 임시 객체를 만들지 않고 사용하던 "Hello," 객체를 그대로 "World!" 객체와 붙이는 형식이다. 속도가 빠르고 메모리면에서 조금 더 효율적인 작업이 가능하다.

StringBuilder를 활용하면 데이터를 추가로 붙이거나 일부를 변경하는 작업이 가능하기 때문에 상황에 따라 필요한 방법을 활용하면 된다.

 

 

문자열 슬라이스

String str_1 = "이름: 김자바";

위의 코드에서 "김자바"라는 값만 사용하고 싶다고 가정해보자.

String은 값의 각각 하나하나에 순서, 즉 인덱스(index)를 붙여 관리하고 있다. 아래의 코드를 활용하여 인덱스 값을 확인해보자.

System.out.println(str_1.indexOf("이"));
System.out.println(str_1.indexOf("름"));

각각 0과 1이 나왔다. 이번에는 substring 함수를 통해 원하는 부분만 잘라보자.

String str_name = str_1.substring(4, 7);
System.out.println(str_name);

substring 함수로 인덱스의 시작과 끝(시작, 끝-1)을 정해 원하는 값인 "김자바"를 얻었다.

 

 

문자열 대소문자 변환

String str_1 = "abc";
String str_2 = "ABC";

str_1 = str_1.toUpperCase();
str_2 = str_2.toLowerCase();

System.out.println(str_1);
System.out.println(str_2);

위의 코드는 소문자를 대문자로, 대문자를 소문자로 변환하는 코드이다.

우리가 대소문자를 굳이 맞춰주는 이유는 사용자가 대소문자를 섞어 입력했을 때, 올바르게 판단하기 위함, 혹은 입력된 값에 대해 통일된 형식을 맞춰서 저장해야하는 경우 등이 있다.

자바에는 대소문자를 동일한 값의 데이터로 인식하게 하는 함수가 있다.

if (str_1.equalsIgnoreCase(str_2)) {
    System.out.println("str_1.equalsIgnoreCase(str_2)");
}

우리가 굳이 대문자 또는 소문자로 변환하지 않아도 대소문자를 무시하고 값을 비교한다.

 

 

공백 제거

1. 양쪽 끝에 공백이 있는 경우

trim()

String str_1 = "      Hello   ";
str_1 = str_1.trim();
System.out.println(str_1);

 

2.  문자열 중간에 공백이 있는 경우

replace()

String str_2 = "Hel   lo";
str_2 = str_2.replace(" ", "");
System.out.println(str_2);

 

 

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

연산자  (0) 2023.05.10
콘솔 입출력  (0) 2023.05.09
형변환  (0) 2023.05.08
변수와 자료형, 그리고 상수  (0) 2023.05.08
Java란?  (0) 2023.05.02

+ Recent posts