본문 바로가기

WINK-(Web & App)/JAVA 스터디

[2024-2 Java 스터디] 김재승 #1주차

반응형
  1. 자바란?

  • 자바는 객체지향 프로그래밍 언어로 가전제품에 탑재하여 동작하는 프로그램을 만들기 위함이 탄생 이유였으나 현재는 웹과 모바일 앱 개발에서 활발히 사용되고 있는 언어이다.
  1. 자바로 할 수 있는 것들

  • 웹 프로그래밍
  • 안드로이드 앱 개발
  • 게임 개발
  • 데이터베이스처리
  • 빅 데이터 분석

.

.

.

etc

  1. 자바 코드의 구조 살펴보기

  • 자바의 기본 구조는 먼저 클래스와 그 아래에 메서드 블록들로 이루워지는데 클래스 명은 소스파일의 이름과 동일하게 지정해야되므로 주의 해야한다. 사진과 같이 클래스를 만들고 아래 메서드 블록에서 접근 제어자 public, private, protected 중에 선택한 후 static 키워드를 사용할지는 선택해서 쓰면 된다. intellij 와 같은 자바의 통합 개발 환경을 지원하는 프로그램 등에선 일일히 메서드 블록을 작성할 필요 없이 psvm 만 쳐도 기본적인 메서드 블록이 완성된다.
  • 메서드 블록 안에 명령문 들을 사용할 수 있는데 가장 흔히 사용되는 것이 바로 print 문이다. system.out.println();의 문법 형식을 지키며 이 또한 특정 ide에서 sout 를 치면 바로 쉽게 프린트 명령문을 작성할 수 있다.
  1. 변수 & 자료형
  • 먼저 변수란 간단히 말해 데이터를 저장할 수 있는 하나의 공간이라고 보면 쉽다. 자바에서는 변수를 사용하여 값을 저장하고 나중에 그 값을 참조하거나 수정할 수 있으며 변수 개념을 사용하기 위해서는 선언과 초기화의 과정을 거쳐야한다.
  • 선언

변수를 선언할 때는 자료형을 같이 지정해줘야 하는데 자료형에는 int ( 정수형)

double ( 실수형 ) , char ( 문자 ) , string ( 문자열 ) , boolean , list … 등 많은 자료형이 존재하며 형식은 ‘ 자료형 변수이름; ‘ 의 형식으로 선언할 수 있다.

  • 초기화

초기화라는 것은 변수가 선언된 기본값에 특정 값을 저장하는 것으로 위와 같이

그냥 age라는 변수가 선언된 상태에 25라는 정수형 value 를 넣음으로써 age라는 변수는 25로 초기화가 된다. 아래에 실수형 변수도 마찬가지이지만 실수형 변수이니만큼 초기화 하는 값은 실수로 써줘야 한다.

  1. 클래스와 메서드 네이밍

  • 클래스의 이름을 짓는 법에는 규칙이 존재한다. 클래스명은 명사이며 대문자로 시작하고 여러개의 단어가 조합될 경우 파스칼 케이스를 따라야 한다는 점이 있다. 여기서 파스칼 케이스는 위 사진과 같이 두 개 이상의 단어가 조합될 때 단어의 첫글자를 대문자로 작성하는 것이다.

  • 메서드의 이름을 짓는 법에도 규칙이 존재하는데 메서드명은 동사로 하며 시작을 소문자로 한다.여러개의 단어가 조합될 경우 카멜 케이스를 따르고 여기서 카멜 케이스란 위 사진과 같이 맨 앞 첫 글자를 제외한 나머지 단어의 첫 글자를 대문자로 작성하는 것이다.
  1. 주석달기

  • 자바에서 큰 맥락을 주석하기 위해선 시작부분에 ‘ /* ‘ 그리고 주석이 끝나는 부분에 ‘ */ ‘ 를 적어주면 된다.

  • 한 줄만 주석을 달고 싶다면 글을 쓰고 ‘ // ‘를 입력하면 해당 줄만 주석이 된다.
  1. 문자열에 대해
  • 이전에 4. 항목에서 문자열 자료형은 string이라고 했었다. 이번엔 직접 문자열 변수를 선언하고 문자열 내장 메서드에 대해서도 알아보겠다.

  • String 선언 방식에는 두 가지가 있는데 첫 번째는 * 리터럴 표기 방식 * 이다. 리터럴은 영어 뜻인 ‘ 그대로 ‘ 선언한다는 것과 같은 말로 위 사진 처럼 ‘ String 변수명 = “문자열”; ‘ 의 형식으로 변수명 옆에 바로 문자열 내용을 넣음으로써 선언할 수 있다. 이어서 두 번째는 * 생성자 (String()) 사용 * 방식으로 흔히들 new로 선언하기 등으로 부르곤한다. ’ String 변수명 = new 생성자(”문자열”); ‘과 같은 형식으로 선언할 수 있고 new키워드를 사용하여 생성장을 이용해서 선언하는 방식이다.
  • 위 두가지 방법에는 차이점이 존재하는데 1번 리터럴 표기 방식은 객체를 생성하는 것이 아닌 그저 고정값을 대입하는 형식이다. 상수 풀(String pool) 이라는 메모리 영역에 저장되며 기존에 상수 풀이 존재할 경우 기존의 객체를 참조한다. 이게 무슨 말이냐면 왼쪽에 있는 str1과 str2는 같은 문자열 리터럴 “Hello” 를 참조하기 때문에 동일한 주소를 가진다고 볼 수 있다. 그러나 2번은 새로운 String 객체를 만드는 방법으로 차이가 1번과 차이가 있다. str3 와 str4는 동일한 문자열을 가지지만 독립적인 메모리 주소를 가진다는 것이다. 이유는 아까 말했듯이 새로운 객체를 생성한 것이기 때문이다.

1번 방식

2번 방식

  • 문자열에는 내장 메서드가 존재하는데 주요 메서드들에 대해 소개해보도록 하겠다.

equals

두 문자열이 같은지 비교하여 True / False 로 결과값을 준다.

contains

문자열이 특정 문자나 문자열을 포함하는지 확인하여 True / False 로 결과값을 준다.

replace

문자열의 특정 부분을 다른 문자열로 바꾼다.

replaceAll

replaceAll 메서도도 존재하는데 이를 통해서 특정 패턴을 찾아 다른 문자열로 대체할 수 있다. 사진에서는 “Java” > “Python” 으로 대체했다.

indexOf

문자열 내에서 특정 문자나 문자열의 인덱스를 반환하며 찾는 문자열이 없으면 -1을 반환한다.

charAt

문자열의 특정 인덱스에 있는 문자를 반환한다.

substring

문자열의 특정 부분을 잘라내서 반환하는 메서드로 시작 인덱스와 끝 인덱스를 지정할 수 있고 끝 인덱스를 생략 시 시작부터 끝까지 반환한다.

toUpperCase

문자열의 모든 문자를 대문자로 변환해 반환한다.

toLowerCase

문자열의 모든 문자를 소문자로 변환해 반환한다.

split

지정한 구분문자를 기준삼아 문자열을 잘라서 문자열 배열로 반환하는 매서드이다. 위 사진에서 첫번째 문장의 구분자는 ‘ , ‘ , 두 번째 문장의 구분자는 ‘공백문자’ 이다.

  • 이번에는 문자열 포맷팅 (formatting) 에 대하여 간단히 알아보도록 하겠다.
  1. String.format 메서드 이용

형식 지정자를 이용해 문자열을 형식화할 수 있다.

%d : 정수

%f : 실수

%s : 문자열

%c : 문자

 

System.out.printf 사용

  • 이번에는 StringBuffer 이라는 자료형에 대해 설명할 것이다. StringBuffer은 문자열을 추가하거나 변경할 때 주로 사용하며 StringBuffer또한 다양한 메서드가 존재한다.

1.append(String str): 문자열을 현재 문자열의 끝에 추가

2.insert(int offset, String str): 지정된 위치에 문자열을 삽입

3.replace(int start, int end, String str): 지정된 범위의 문자열을 다른 문자열로 대체

4.delete(int start, int end): 지정된 범위의 문자열을 삭제

5.reverse(): 문자열을 역순으로 변환

Stringbuffer은 문자열을 자주 수정할 경우에 용이하며 멀리스레드 환경에서 동기화를 지원해 안전하게 사용할 수 있다는 장점이 존재한다.

 

배열 & 리스트

  1. 배열(Array)

배열은 데이터를 저장하는 자료구조로 크기가 고정되어 있으며 동일한 타입만 저장가능하다는 점과 특정 위치에 빠르게 접근할 수 있다는 특징이 있다.

numbers라는 배열을 선언 하고 선언과 동시에 5칸 짜리 배열로 초기화 하였다. 해당 인덱스에 0부터 4까지 총 5칸에 해당하는 배열에 각각 값을 집어넣고 for문을 통해 각각의 인덱스에 해당되는 값이 출력되도록하는 명령어를 작성하였고 for each 문을 사용하여 배열에 들어있는 값들을 출력하는 코드 또한 작성했다.

출력 결과는 왼쪽과 같다.

 

   2. 리스트(List)

리스트는 순서가 있는 데이터의 모음으로 크기가 가변적이고 다양한 데이터 타입을 저장할 수 있고 동적 관리가 가능해 유연하다는 특징이 있다.

names라는 리스트를 선언 후 초기화하고 "Alice”,"Bob”,"Charlie”을 각각 순서대로 리스트에 추가한뒤 for each 문을 통해 출력하는 코드를 써봤다. 출력결과는 리스트는 순서가 있기때문에 "Alice”,"Bob”,"Charlie”순서대로 출력될 것이다. 요소를 제거도 할 수 있으며 추가하면 뒤에 추가되는 형식이라고 보면 된다.

출력 결과는 왼쪽과 같다.

  • 제네릭스

제네릭스란 자료형을 사전 설정해서 형변환 오류 및 번거로움을 줄일 수 있는 기능이다.

(왼쪽 사진과 같이)< > 사이에 자료형을 적어주는 것)

 

------------

차이점을 정리해보면 다음과 같다.

배열(Array) 리스트(List)

크기 고정 (생성 시 지정 후 변경 불가) 가변 (동적으로 크기 조정 가능)
저장 타입 동일한 데이터 타입만 저장 가능 제네릭을 사용해 다양한 타입 저장 가능
추가/삭제 불편 (크기 변경 불가, 직접 조작 필요) 편리 (add(), remove() 메서드로 요소 관리)
사용 용도 고정된 크기의 데이터를 다룰 때 유리 동적으로 크기가 변하는 데이터를 다룰 때 유리

(점프 투 자바 1~85p)



Quiz 풀이

 

다음 중 int 자료형의 크기는? 32bit(4byte)> c

 

Java에서 소수점이 있는 실수형 데이터를 저장하기 위해 사용하는 자료형은? c

 

double 자료형과 float 자료형의 차이점은 무엇인가? 비트 수 차이> b

 

다음 중 boolean 자료형이 가질 수 있는 값은? a

 

다음 중 boolean 값을 반환하는 메서드는? a

 

다음 중 boolean 표현식을 적절히 사용하는 경우는? b

 

다음 중 문자열을 상수 풀(String Pool)에 저장하는 방법은? 리터럴로 선언하기> b

 

다음 중 문자열 길이를 반환하는 메서드는? length()> a

 

다음 코드의 출력 결과는 무엇인가? value는 같지만 object가 다름 따라서> b

 

Java에서 배열의 길이를 얻기 위해 사용하는 속성은? 문자열길이를 반환하는 메서드는 length(), 배열의 길이를 얻기위해 사용하는 속성은 length() > c

 

다음 중 Java에서 다차원 배열을 선언하는 올바른 문법은? b

 

배열에 초기값 없이 선언된 int 배열의 기본값은? a

 

다음 코드의 출력 결과는? c

 

Java에서 List 인터페이스를 구현한 클래스가 아닌 것은? c

 

다음 중 ArrayList의 기본적인 특징은 무엇인가? c

 

List에서 요소를 추가할 때 사용하는 메서드는? list에서는 insert메서드는 없음 오로지 문자열 삽입에 쓰는 것 c

 

다음 코드의 출력 결과는 무엇인가? b(제네릭스)

 

List의 요소를 반복하기 위해 사용할 수 있는 방법인 것은? d



서술형

 

1.Java에서 기본 자료형(primitive types)과 참조 자료형(reference types)의 차이점에 대해 설명하시오.

ㄴ단순한 값을 저장하는 기본 자료형과 달리 참조 자료형은 객체나 배열과 같은 복잡한 데이터를 저장하는 자료형이다.

참조 자료형 종류의 예시로 클래스,배열 등이 있다.

 

2.숫자형 자료형 간의 형 변환(예: int에서 double로 변환)이 발생할 때의 주의사항을 설명하시오.

ㄴ큰 자료형에서 작은 자료형으로 갈 때 범위를 벗어나서 오버플로우가 발생할 수 있으며 정수만 나타내는 int에서 double과 같은 자료형으로 변환했을 시에 큰 정수에서 정밀도 손실이 생길 수 있다.

 

3.Java에서 String 객체를 생성하는 두 가지 방법(리터럴 방식과 new 키워드 사용)의 차이점을 설명하시오.

ㄴliteral 방식으로 객체를 생성할 시에 값만 저장하므로 객체가 동일하지만 new 키워드를 사용하면 새로운 객체를 생성한다는 점에 차이가 있다.

 

4.Java에서 문자열을 연결하는 방법 (String & StringBuilder)을 설명하고 어떤 방법이 성능 면에서 더 유리한 지 서술하시오.

ㄴString 으로 연결했을 때 for문 등을 돌리게 되면 객체가 계속 생겨서 성능 면에서 저하가 생길 수 있으나 StringBuilder를 사용하면 가변 객체를 이용해서 문자열 수정 시에 새로운 객체가 생성되지 않으므로 성능 면에서 더 유리하다. cf.)StringBuffer은 문자열을 수정 가능한(mutable) 객체로 다룰 수 있으며 동기화 처리가 되어있음

 

5.Java에서 문자열 비교 시 == 연산자와 equals() method의 차이점을 설명하시오.

ㄴ 문자열을 ==로 비교하면 해당 결과값이 (value가 같아도) false가 나올 수 있다. 왜냐면 객체가 다를 수 있기 때문인데 equals() 메서드를 사용하면 정확하게 그 값만 비교가능하다.

 

6.배열 선언 방법 2가지를 작성하시오.

ㄴint[ ] array1 = new int[3]; >just declare > 크기 3의 정수형 배열 생성, 모든 배열 요소는 기본값으로 초기화 int[ ] array2= {1, 2, 3}; >declare&create> 선언할 때 초기값을 직접 지정하는 방법

 

7.배열의 크기를 변경할 수 없다는 특성을 설명하고, 이 문제를 해결하기 위해 사용할 수 있는 대안에 대해 설명하시오.

ㄴ배열은 크기가 고정된 자료구조인데 이를 해결하기위해 ArrayList를 사용할 수 있다 ArratList 클래스를 사용하게 되면 요소를 추가 또는 삭제 시 자동으로 크기가 조정되고 다양한 메서드를 사용할 수 있다


코테 2문항

  • 숫자 비교하기 (난이도: 하)

sol: num1과 num2의 값이 같은 경우 정수형 변수 answer값을 1로 선언하고 그 값을 리턴했습니다. 반대로 그렇지 않은 모든 경우, answer값을 -1로 선언하고 그 값을 리턴하도록 했습니다.

  • 문자열 내 p와 y의 개수 (난이도: 중하)

sol: 전체 문자열 개수를 먼저 계산한 뒤에 p를 공백처리 한 뒤 문자열 개수를 세어 빼면 p의 개수가 나옵니다. 같은 방법으로 y의 개수를 구할 수 있고 return 값으로 p == y 인 경우 True가 리턴되고 그렇지 않으면 false가 리턴됩니다.

반응형