[자바]객체지향언어란, 클래스란, 멤버변수vs지역변수
- 클래스 class : 실생활에서 도면에 해당하는 것, 객체를 만드는 원판
- 객체 object=instance : 도면을 이용해서 찍어내는 제품, 원판을 통해 만들어진 객체
- 인스턴스화 : 클래스 - 인스턴스화(=객체화=객체생성=메모리에 객체가 생성됨)-> 객체
향상된 for문인 for each문은 기존 for문과 비교해서 초기값과 증감식을 사용하지 않으며 배열이 가지고 있는 요소들을 특정 변수로 바로 할당해서 사용할 수 있게한다
1 | for(데이터타입 변수명 : 반복할 배열명/컬렉션){ |
이 반복문은 내부적으로 배열의 인덱스 0번부터 배열의 길이만큼을 반복한다.
장점 : 전체적으로 for문을 훨씬 간결히 작성할 수 있다.
단점
결론 : 따라서 인덱스를 써야하거나 특정범위를 반복해야하는 경우는 전통적인 for문을 쓰고 아닐 경우 for each를 쓰면 된다
아래 for문과 for each문의 예시를 보자.
랜덤한 짝수를 3개를 뽑은 뒤 그 합을 구해보자.
랜덤한 짝수 3개뽑기는 index를 사용해야하기때문에 for each를 쓸 수 없다.
뽑은 짝수합을 구하는 경우 index도 필요없고 특정범위반복도 필요없기때문에 for each를 쓰면 한결 간결해진다.
1 | int[] evendatas = new int[3]; |
배열과 같은 자료구조에 대해서는 정렬에 대한 요구사항이 빈번하다.
정렬을 구현하기 위한 알고리즘은 버블 정렬, 선택 정렬, 삽입 정렬 등 여러가지 방식이 있다.
Arrays클래스 API를 이용하기 위해 import java.util.Arrays;해줘야한다.
만약 문자열을 관리하는 배열이 파라미터로 들어온다면 대문자->소문자의 사전순으로 정렬한다.
1 | int[] data = {5, 7, 2, 9, 1}; |
배열데이터를 출력하기 위해서 for문을 이용해도 되지만 Arrays클래스 API를 이용하여 출력할수있다.
Arrays.toString(arr)사용하기 위해서는 import를 먼저 해야한다.
1 | String [] arr1 = {"JAVA", "is", "Not", "bad"}; |
배열에 무작위 숫자로 구성된 로또를 만들고 정렬 후 출력하는 게임을 만들어보자.
로또는 1~45사이의 숫자로 구성되며 6개의 숫자를 랜덤으로 뽑느다.
그리고 모든 숫자의 중복 x.
1 | int[] selected = new int[6]; //로또를 저장할 배열 |
random.nextInt(n)
이는 0~(n-1)개의 정수를 랜덤하게 생성한다.
그렇다면 여기선 random.nextInt(45)이므로 0~44사이의 랜덤한 정수를 생성하게된다.
왜그럴까?
selected된 공은 index에서 +1해주기때문이다
if문을 보자.
랜덤으로 index가 0이 걸리면 선택된 공은 1이되고
랜덤으로 index가 44가 걸리면 선택된공은 45가된다.
ball if문으로 중복체크
ball = 0이 참이면 이 fullBall[index]가 한번도 뽑힌적이 없는 숫자라는 의미이다.
그리고 선택되어지고 selected[cnt] = index +1
을 준다.
그리고 이미 뽑힌 수는 -1로 값을 준다.
그렇게되면 다음번에 또 뽑혔을때 -1이기때문에 거짓이 되어 selected가 되지않는다.
1 | 예를 들어 |
배열은 한 번 생성되면 메모리의 연속성때문에 그 크기를 변경할 수 없다.
하지먼 프로그래밍을 하다 보면 처음 예상했던 데이터의 개수보다 더 많은 데이터를 관리해야할 경우가 있다.
이를 예방하기위해 처음부터 배열의 크기를 크게 지정해버린다면 불필요한 메모리를 낭비하는 꼴이다.
필요에 따라 배열의 길이를 늘이기 위해서는 기존배열의 길이를 늘일수는 없고
배열의 길이 큰 새로운 배열은 만들고 기존 데이터를 복사해 넣은 다음 새로운 데이터를 추가해야한다.
1 | int[] source = {1,2,3}; |
System.arraycopy(기존배열명, 카피할데이터인덱스, 새로운배열명, 데이터붙여넣을시작인덱스, source.length);
아래처럼 데이터붙여넣을시작인덱스에 2를 넣었기때문에 출력값은 인덱스2번부터 [0, 0, 1, 2, 3, 0, 0]부터 붙여넣기가 된다.
만약 0을 넣었다면 출력값은 인덱스0번부터 [1, 2, 3, 0, 0, 0, 0]이 된다.
1 | int[] source = {1,2,3}; |
GUI환경에서 가장 잘 사용하는 메서드이다.
정수의 형태인 파라미터를 int로 변경해 리턴한다.
만약 파라미터가 정수형태가 아닐 경우 NumberFormatException 에러가 난다.
369게임을 만들어보았다.
일의 자리와 소수점첫번째자리를 나누어서 처리했다.
변수 input는 사용자가 scanner를 통해 입력하는 숫자이다.
변수 remainder는 숫자를 10으로 나눈뒤 소수점첫째짜리를 3,6,9인지확인한다.
함수 divideTen()는 10으로 나눠서 369인지 체크하는 반복되는 코드이므로 밖으로 뺐다.
함수를 어디로 빼야하는지몰랐는데 main함수밖이면서 class안으로 빼야하는 것이었다.
1 | public class game369 { |
강사님 코드는 아래와 같다.
박수치는 횟수를 카운드해서 if조건문으로 박수2번이면 박수짝짝을 입력하는 함수이다.
1 | public static void main(String[] args) { |
자바 format string은 System.out.printf(“”,)를 이용하여 나타낸다.
주요한 변환코드는 아래와 같다.
포맷스트링으로 자릿수도 표현할 수 있다.
Random 라이브러리 : 무작위 숫자를 생성하기 위해 Random 객체를 사용해야하기때문에 import해야한다.
null : 아무 값이 없다. 예약어이고 실제 값은 맨 뒤에 위치해있다.
nextlnt(n); : 매서드로 0 ~ (n-1)사이의 무작위 정수를 생성한다.
아래 코드는 0부터 99중에 랜덤숫자를 뽑아서 50이상이면 큰수로 출력하고 그 이하면 작은수로 출력한다.
1 | import java.util.Random; |
반복문은 크게 3가지 종류가 있다.
for 문, while 문, do ~ while문!
상화별로 추천하는 반복문이 있다.
for 문 : 반복해야하는 횟수가 지정될 경우 유리
1 | for(초기화;조건식;증감식){ |
while 문 : 반복횟수보다는 상황에 의한 반복을 정의할 경우 유리
1 | while(조건식){ |
do ~ while문 : while작업 중 최소 한 번은 실행해야 할 작업이 있는 경우 유리
1 | 초기화; |
실제 값.
변수의 값이 변하지 않는 데이터(메모리 위치안의 값)이다.
b1과 b2는 연산결과는 잘 나오지만 b3의 연산결과는 에러가 난다.
1 |
|
산술연산자는 기본적으로 int형이다. 그래서 type mismatch가 나타난다
int형으로 산술하면 잘~출력된다
1 | int i1 = 100; |
아래 데이터형의 차이점이 뭘까?
1 | int a1 = 100; |
void와 int 매서드의 차이를 알아보자
public static 뒤에 void가 오기도하고 int등 다른 데이터타입이 올 수 있다.
1 | public static void 매서드이름(매개변수){ //void 매서드 정의하기 |
1 | for(int i=1; i<=10; i++){ |
1 | int sum = 0; |
1 | int count = 0; |
자바에서는 typeof는 없고 각 데이터별로 체크할 수 있는 방법이 있다
1 | // 1. 사용자로부터 입력받아오자 |
scanner로 사용자로부터 양수 n개를 받아 그 중 최대값을 화면에 출력해보자
기본적으로 양수 n개를 받는 코드를 작성하면 아래와 같다
1 | Scanner sc = new Scanner(System.in); |
이제 두가지 방법으로 최대값을 구해보자
1 | int max = num[0]; |
1 | int max = num[0]; |
위의 코드를 자세히보자. 리팩토링할 부분이 보인다.
max가 가장 큰 수 인 경우 굳이 동일값(max = max;)을 대입할 필요가 없다
1 | int max = num[0]; |
중괄호를 생략하니 세상 간단간단해보인다
char는 연결연산자가 사용이 안된다.
String이 어느 한 변수 이상에 있는 경우에는 연결연산자가 사용이 된다.
캐릭터에서 연결연산자를 사용하고싶으면 변수들 사이에 “”를 입력해줘야한다.
1 | char c1= 'a', c2= 'b'; |
만약 char를 ab로 나타내고 싶다면 변수들 사이에 “”해주면 된다
1 | char c1= 'a', c2= 'b'; |
괄호가 있으면 다 메서드라고 부른다
매서드는 항상 Class라는 주인이 있어야 한다.
다른 사람이 만들어 놓은 매서드를 사용할 수 있다. = 라이브러리라고 부른다
예시
변수
변하는 값.
값을 저장할 수 있는 메모리 위치.
변수를 사용하기위해서는 항상 변수선언을 데이터타입과 함께 먼저 해줘야한다.
상수
변하지 않는 하나의 값
앞에 final이 붙는다
배열이란 쉽게말해 여러개의 변수를 한꺼번에 선언하는 것이다
변수를 선언한다는 것은 메모리에 a변수가 생성이 된다는 의미이다.
배열에서는 변수갯수를 선언할 수 있다 -> int [] ar = new int[10]
는 메모리에 10개의 정수 변수 생성된다는 의미이다
여기서 주의할 점은 ar1의 데이터타입은 int가 아님을 명심하자!
int[]의미는 int를 관리한느 배열타입이지 int타입이 아니다.
ar1의 데이터타입은 기본형에 포함되지않는 참조형의 데이터타입이다.
배열객체를 생성하기 위해서는 new키워드와 함께 어떤 데이터를 몇개나 저장할지에 대한 정보가 필요하다.
그렇다면 new키워드란 무엇일까?
아래 잘 설명한 블로그가 있어서 가져왔다.
참고링크 : 자바 변수들의 메모리 구조,new 키워드
배열변수선언에는 두가지 방법이 있다
배열생성과 배열갯수만 선언하는 방법이다int [] ar1 = new int[3]
로 배열과 배열갯수를 한꺼번에 선언. 초기화는 안됨!
1 | int [] ar1; //배열생성 : 메모리에 a변수 생성 |
데이터형마다 기본값이 다르다
기본데이터형이 아닌 참조데이터형인 경우 기본값이 다르다
1 | char [] chs = new char[2]; |
1 | String [] str = new String[3]; |
1 | Person[] p = {new Person, new Person}; |
타입이 다른 참조형데이터를 하나의 배열에 넣을 순 없을까?
다형성을 이용하면 가능하다.
상속관계인 경우에만 타입이 다른 참조형데이터를 하나의 배열에 묶을 수 있다.
1 | Person[] p = {new Person. new Person} |
배열생성과 초기화를 한꺼번에 선언하는 방법이다
int [] ar2 = {10, 20, 30}
여기서는 new int[5]를 하지않아도 된다 왜냐면 위의 코드 자체에 변수갯수선언이 포함되어있다
이 방법은 테스트용으로 주로 사용할뿐 실무는 new int[]형태로 사용한다
1 | int [] ar2 = {10, 20, 30}; //배열생성과 초기화 한꺼번에! |
기능 : 키보드로부터 데이터를 받아온다.
java.util 패키기에 있는 중요한 라이브러리이므로 사용법은 암기필수.
1 | //1. 선언 |
다른 명령어들은 아래와 같다
1 | sc.nextInt() |
처음 떠오른 코드는 아래와 같다.
1 | Scanner sc = new Scanner(System.in); |
그런데 string으로 연산자를 받으니까 연산이 되지않으니까 int로 형을 바꿀려고했는데 Cannot cast from String to int
에러가 났다.
사칙연산자들의 데이터타입이 무엇인지 구글링했는데 그래도 잘 모르겠어서
강사님께 여쭈어보니 string을 int로 받아도 해결할 수 없다고 한다.
if문을 써서 equals()를 쓰는게 낫다고 했다
equals()를 어떻게 쓰는지 찾아본 뒤 바로 적용해보았다
1 | Scanner sc = new Scanner(System.in); |
작동 잘된다! 역시 가르쳐주는 사람이 있으니까 좋다
switch문으로 바꾸어보자
1 | switch(operator){ |
정수식안에는 변수, 숫자, 문자, 조건들이 들어갈 수 있다.
case안의 값에는 and연산자, Boolean, 실수는 아예 들어갈 수 없다.break;
문이 없을 경우 다음 break;
를 찾을때까지 모든 문장을 실행한다.
default문은 가장 마지막 작업으로 위의 case 이외의 값인 경우 default문은이 출력되고 Switch문은 끝난다
1 | switch( 정수식 ){ //숫자,문자 |
예시
1 |
|
임의의 노래방 점수를 터미널에 입력하면 점수대별로 아래 문구를 출력하고싶다.
100점의 문구 : 실화냐? 가수다! 가수가 나타났다!
80 ~ 99점의 문구 : 노래실력이 아주 좋으신데요~
40 ~ 79점의 문구 : 매력이~ 넘쳐요
40점미만의 문구 : 노ㄹ..아니 박수실력이 나날이 늘어가네요!
그외의 점수들 : 잘못된 숫자를 입력하셨습니다.다시 입력해주세요
if일때
1 | Scanner sc = new Scanner(System.in); |
switch일때
1 | switch(inputScore/10){ |
for문의 기본은 아래와 같다
1 | for(int i=0; 조건식; 증감식){ |
간단한 예시를 보면서 어떻게 컴파일이 되는지 순서를 보자
1 | for(int i=1; i<10; i++){ |
반복문에서 break를 사용하면 반복문이 바로 종료된다.
구구단 3단 예시를 들어보자
1 | int multiply; |
출력값의 마지막 컴마를 없애고 싶다.
어떻게 하면 좋을까? if와 break를 사용해보자.
1 | int multiply; |
break를 입력하면 if조건이 만족되는 순간 바로 반복문이 종료된다
아래 예시는 구구단 3단 나타내지만 if조건문을 5까지 입력했다
즉 3*5
까지 진행하는 구구단이다.
1 | int multiply; |
x가 6,7,8,9가 남았지만 if조건을 만족하고 break때문에 반복문이 종료된다.