패스트터틀

(basic) java개념, Buffer, new, Generic, sort, 동적 .... 본문

Development language/java

(basic) java개념, Buffer, new, Generic, sort, 동적 ....

SudekY 2019. 11. 6. 14:27

 본 포스팅은 블로거가 개발언어의 개념정리 필요를 위한것입니다.

목차와 차례가 뒤죽박죽이며 오직 블로거의 편의목적을 위해 작성되었음을 알려드립니다. 

- java 와 c의 차이점

- struct와 class 차이점

- 캡슐화, 다형성, 상속

- java In VScode

- JVM

- import java.lang, java.util , java.io ??? ...

- 입/출력

- 배열

- Exception

- Integer와 int의 차이는 무엇인가?

- 동적배열(List,ArrayList,vector)

- 내림차순

- Scanner와 BufferedReader 차이

- BufferedReader, BufferedWriter을 사용하기

- 배열선언시 [][] 초기화 null

- new의 의미

- interface(인터페이스)

- Generic(제네릭)이란?

- Arrays.sort()

- charAt();

- '==' 연산자 비교

 

 

 

- java 와 c의 차이점

c와 java의 가장 큰 차이점은 객체와 순차지향의 차이이다.

쉽게 말해서 c는 순차적형태로 java는 객체형태로 코딩된다.

또하나의 큰 차이점이라면

c는 포인터를 사용하고 java도 포인터를 사용하지만

c는 포인터를 직접 만들어야하고 java는 알아서 만들어준다.

포인터가 어려운 사람은 java가 쉽다고 느낄수 있다.

하지만 포인터의 개념을 모른다면 java또한 성숙한 프로그래밍은 불가능하다.

 

 

- struct와 class 차이점

공통점
여러가지 자료형 하나로 묶는거 가능
새로운 자료형처럼 사용가능
인터페이스 구현 가능
'.' 을 통해서 참조가능
struct class
안에가 비어있으면 안됨 비어있어도 생성가능
값형식 참조하는 형식

스택 할당(내가 알기론 힙에다가 동적할당도 가능은 한것으로 알고 있음)

힙 할당
상속 안됨 상속가능
생성자가 필요없음 생성자필요
method없음 method있음

 

-캡슐화, 다형성, 상속

캡슐화 : 정보은닉을 목적으로(private,protected,public 사용)

다형성 : 자동차에 들어가는 타이어의 종류를 위해서(금호타이어,한국타이어등) 규격은 똑같은데 성능은 다를경우 위해

상속 : 똑같은 코드를 또 만드는것보다 기존에 있는것들로부터 상속받아 사용하기위해서

 

- java In VScode

VScode에서 java파일 생성시 java Extension을 설치하라는 알림이 뜬다.

알림에 "예"를 누르면 설치로 안내되는 페이지가 뜨는데 설치하면 된다.

import는 visual studio code에서는 표시되지 않는다고 명시되어있었다.

 

- JVM

 

JVM은 어느 운영체제에서나 상관없이 작동하게끔하는 JAVA가상머신이다.

어플리케이션과 <-> JVM이 서로 소통하여 어플리케이션이 작동되며

JVM은 메모리관리를 자동적으로 한다.

 

- import java.lang, java.util , java.io ??? ... 

c++에서 다음과 같이 축약해서 쓰는것처럼

#include<iostream>

int main(){
	std::cout << "hello" << endl;
}
#include<iostream>

using namespace std;

int main(){
	cout << "hello" << endl;
}

java에서도 다음과 같이 축약해서 쓴다.

class Klass{
	public static void main(String args[]){
    	java.lang.System.out.println("Hello");
        java.lang.String Box;
    }
}
import java.lang.*
import java.util.*
import java.io.*
bulabula~~~

class Klass{
	public static void main(String[] args){
    	System.out.println("Hello");
        String Box;
    }
}

해당 클래스에서 꺼내서 쓰는것들이며

그래서 java에서는 class가 중요한것이다

 

-  입/출력

 

가장 기본적인것에 앞서 java파일은 class이름과 동일하며 첫글자는 대문자여야한다.

예를들어, 다음 사진과 같이 설정한다.

Java의 출력을 아래와 같은 코드로 작성한다.

모든것들은 클래스의 형태로 나타내진다.

자바에서는 System이라는 표준입출력 class 를 제공해주고 그곳에 out 안에 println을 사용하는것이다.

그러니까 전부 클래스를 사용해서 끌어다는쓰는것은 객체지향을 위함이고

c언어와 다르게 자바에서는 항상 클래스로부터 끌어다쓴다는것을 항시 생각하며 사용해야한다.

public class Study{

    public static void main(String[] args){
        
        System.out.println("Hello World");
    }
}

java의 입력은 아래와 같은 코드로 작성한다.

 

	public static void main (String[] args) throws java.lang.Exception
	{
		Scanner sc = new Scanner(System.in);
		String a;
		System.out.print("입력하세요 : ");
		a = sc.next();
		System.out.print(a+"를 입력하셨습니다.");
	}

 

- 배열

java에서의 배열선은 다음과같이 할수있다.

 

int[] a;

int a[];

int a[] = new int[5];

int[] a = {1,2,3,4};

 

- Exception 예외처리

 

시스템의 오류는 걱정하지 않아도 되지만 개발부분에서 예외적인상황에서 처리하기위함

http://www.nextree.co.kr/p3239/

 

Java 예외(Exception) 처리에 대한 작은 생각

일상생활에서도 기본적인 것은 고민하지 않고 습관처럼 사용하는 경우가 있다. 초급 개발자인 나에게 ‘예외(Exception)’이 바로 그런 것이었다. 처음 JAVA수업 때 강사님께 "왜 로직을 try문으로 감싸고, 또 catch(e)는 무엇인가요?"라는 질문을 한 적이 있다. 돌아온 대답은 "이렇게 안하면 에러가 나니까."였다. 나는 이것을 안 하면 어떤 일이 벌어지는지

www.nextree.co.kr

 

- Integer와 int의 차이는 무엇인가?

 

Boolean, Character, Number >  Object class 자손

Byte. Short, Integer, Long, Float, Double, BigInteger, BigDecimal > Number class 자손

 

메소드의 인수로 오로지 타입만을 전달할때 예를들어 다음과같을때

method(타입)

이런식일때 method(int) , method(char).. 와 같이 전달할수없기에 타입을 객체화 시켜서 전달할 필요가있는데

이럴때 필요한것이 Wrapper Class의 Byte, Short이다.

int와 char를 제외하고는 앞에대문자만 붙혀주면된다.

 

Wrapper 클래스와 기본타입이 변환되는것을 

Boxing(Wrapper > 기본)과 UnBoxing(기본 > Wrapper)이라고 표현하며

JDK1.5 버젼이상부터 AutoBoxing으로 처리되어 코드작성시 new로 하여금 새로 객체를 바꿀필요는없다.

예를들어 다음과같다.

Integer num = new Integer(17); // 박싱
int n = num.intValue();        // 언박싱
System.out.println(n);

 

Character ch = 'X'; // Character ch = new Character('X'); : 오토박싱
char c = ch;        // char c = ch.charValue();           : 오토언박싱
System.out.println(c);

new로 하여금 생성할필요도 num.intValue를 사용하여 언박싱을 할 필요도 없어진것이다(편리함).

 

Integer.parseInt >> 원시타입으로 변환

Integer.valueOf >> wrapper클래스 타입 Integer 으로 변환 

 

 

- 동적배열(List,ArrayList,vector)

c언어에서의 동적배열이 정말 기억에 많이 남기 때문에 배열을 하는김에 바로 동적배열을 공부해야겠다.

c언어에서의 동적배열은 스택영역에서 불가능하기에 항상 malloc()으로 heap영역에 접근하여서 포인터로 연결후 동적으로 할당받아서 내가 필요한만큼의 메모리공간을 사용할수 있었다.

 

자바에서는 동적배열을 하기위해서 malloc을 선언하고까다롭게 해줄필요없다. 왜냐하면 어짜피 알아서 처리해주기 때문이다.

 

우리가 사용할것은

 

ArrayList, vector 그밖에 내가 모르는 것 등등 이다. 

 

Vector와 Arraylist 차이점 :

vector는 동기화를 위해 사용되면 멀티스레드가 아닌경우 ArrayList를 사용하는것이 맞다고한다.

쓰레드안전을 보장하기에 vector는 한번에 하나의 Thread에서만 관여가

ArrayList에서는 여러 Thread에서도 관여가 가능하다. 

 

LIST: 

https://aljjabaegi.tistory.com/427(LIST 기본개념)

 

JAVA Collection Framework 정리, 자바 컬렉션, List, Set, Map, Queue Stream 1부 List

JAVA Collection Framework 정리, 자바 컬렉션, List, Set, Map, Queue, Stream 1부 List 자바에서는 데이터를 저장하기 위한 저장소로 배열과 컬렉션 프레임워크를 제공합니다. 그럼 배열이 있는데 왜 컬렉션 프..

aljjabaegi.tistory.com

 

 

ArrayList : 

ArrayList list1 = new ArrayList();
list1.add("ONE");
list1.add("TWO");
 
System.out.println(list1);
 
list1.add(1,"1.5");		// 추가
System.out.println(list1);
 
list1.remove(1);	// 삭제
System.out.println(list1);

list1.set(1,"5"); // 수정

//https://mainpower4309.tistory.com/2

 

list만들기 : List<String> list = new ArrayList<String>();

기존 배열 바로복사하기 : List<int[]> list = Array.asLIst(arr)

 

(아래참조)

Scanner 와 BufferedReader 사용

public class main {
    public static void main(String[] arv) throws NumberFormatException, IOException {
        BufferedReader sc  = new BufferedReader(new InputStreamReader(System.in));
 
        int [][] array = null;
         
        System.out.println("몇개의 반이 있나요");
        int x = Integer.parseInt(sc.readLine());
        array = new int[x][];
         
        for(int i =0; i<array.length; i++){
            System.out.print((i+1)+"반의 학생수를 입력하세요");
            int y = Integer.parseInt(sc.readLine());
            array[i] = new int[y];
        }
         
          for(int i=0; i<array.length; i++){
                for(int j=0; j<array[i].length; j++){
                    System.out.println("["+ i +"]["+ j +"]");
                }
 
         
         
        }
    }}

c <==> java

 

 

 

 

- 내림차순

 

오름차순은 sort를 사용하면 금방 되지만

자바에서 내림차순은 은근히 복잡하다. 

 

1.

	String[] str1 = {"홍길동","장발장","허준","김흥도","라이츄"};
	
        String[] str2 = {"like","love","pika","lonely","you"};

        int[] num1 = {82,45,26,4,7,3};

        integer[] num2 = {82,45,26,4,7,3};       

 

        //오름차순

        Arrays.sort(str1);  // 김흥도 , 라이츄 , 장발장 , 허준 , 홍길동

        Arrays.sort(str2); // like , lonely , love , pika , you

        Arrays.sort(num1); // 3 , 4 , 7 , 26 , 45 , 82

       

        //내림차순

        Arrays.sort(str2, Collections.reverseOrder()); // you , pika , love , lonely , like

        Arrays.sort(num2, Collections.reverseOrder()); // 82 , 45 , 26 , 7 , 4 , 3

※ Arrays.sort 사용후 Collections.reverseOrder사용시 원시타입은 사용불가능하다. 그래서 integer를 사용한다.

integer는 Wrapper클래스로 위쪽에 Wrapper클래스 설명참고

 

2.

Integer rope[] = new Integer[count];
List<Integer> list = Arrays.asList(rope);
Collections.reverse(list);

3.

사용예

            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int count = Integer.parseInt(br.readLine());
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < count; i++) {
                list.add(i,Integer.parseInt(br.readLine()));
            }

            Collections.sort(list,Collections.reverseOrder());

            for (int i = 0; i < list.size() ; i++){
                System.out.println(list.get(i));
			}

 

 

 

- Scanner와 BufferedReader 차이

 

 

Scanner vs. BufferedReader

As far I know, the two most common methods of reading character-based data from a file in Java is using Scanner or BufferedReader. I also know that the BufferedReader read files efficiently by usi...

stackoverflow.com

Scanner sc = new Scanner(https://www.tutorialspoint.com/java/util/java_util_scanner.htm)

안에 들어갈것들은 해당 링크

 

 

 

- BufferedReader, BufferedWriter을 사용하기

 

 

[Java] BufferedReader, BufferedWriter 를 이용한 빠른 입출력

알고리즘 공부를 하면서 별 의미를 두지는 않았었으나, 실제로는 입출력 때문에 유의미한 시간의 차이가 나는 경우가 꽤 있었기에, BufferedReader 와 BufferedWriter 를 이용하여 입출력 받는 방식에 대해 간단하..

snacky.tistory.com

사용방법

아무거나 입력하면 아무거나 바로 출력되는 아주 간단한 코드

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
	public static void main (String[] args) throws java.lang.Exception
	{
		BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
		String a = br.readLine();
		BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( System.out ) );
		bw.write(a);
		bw.flush();
		bw.close();
	}
}

 

- StringTokenizer

 

StringTokenizer는 공백에따라서 문자열을 잘라주는것

다음과 같이 BufferedReader와 혼합하여 사용가능하다.

 

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] str = br.readLine().split(" ");

만약에 위와같이 만들경우 str[0] = str[1] .. 이런식으로 여러개가 형성되고 비효율적이다.

 

그리고 무엇보다 split의 내부구조는 복잡한데 비하여 StringTokenizer를 사용할경우 그저 공백다음에 있는것을

끌고와서 사용하는 로직을 사용하기 때문에 속도면에서 split보다 빠르다고 한다.

 

StringTokenizer의 사용법은 BufferedReader와 혼합할경우 다음과 같이 사용하면된다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in);
StringTokenizer st = new StringTokenizer(br.readLine());

후에는 st.nextToken()으로 불러올수있다.

이런식으로 나누는방법과 hasMoreTokens()를 사용할경우 간단하게 while문으로 끝까지 불러올수있다.

StringTokenizer st = new StringTokenizer(str,"%%");

 

 

while(st.hasMoreTokens()) { 
        System.out.println(st.nextToken()); 
    }

 

 

- 배열선언시 [][] 초기화 null

 

https://dojang.io/mod/page/view.php?id=293

 

C 언어 코딩 도장: 36.1 배열을 선언하고 요소에 접근하기

배열은 변수 이름 뒤에 [ ] (대괄호)를 붙인 뒤 크기를 설정합니다. 그리고 배열을 선언하면서 값을 초기화할 때는 { } (중괄호)를 사용합니다. 자료형 배열이름[크기]; 자료형 배열이름[크기] = { 값, 값, 값 }; 다음 내용을 소스 코드 편집 창에 입력한 뒤 실행해보세요. array.c #include int main() { int numArr[10] = { 11, 22, 33, 44, 55, 66, 77, 88, 99, 110 }; // 배열을

dojang.io

 

- new의 의미

 

== malloc in c

 

answer 1 : 

Java's version of malloc is new -- it creates a new object of a specified type.

In Java, memory is managed for you, so you cannot explicitly delete or free an object.

 

answer 2 : 

new instead of malloc, garbage collector instead of free.

 

https://stackoverflow.com/questions/4404872/is-there-something-like-malloc-free-in-java

 

Is there something like malloc/free in java?

I've never seen such statements though,does it exist in java world at all?

stackoverflow.com

- interface(인터페이스),abstract,final

 

대표적인 추상클래스이다.

 

https://www.studytonight.com/java/java-interface.php

 

Interfaces in Java | Core Java Tutorial | Studytonight

Interfaces in Java Interface is a pure abstract class.They are syntactically similar to classes, but you cannot create instance of an Interface and their methods are declared without any body. Interface is used to achieve complete abstraction in Java. When

www.studytonight.com

인터페이스 : 뼈대

 

 

interface는 위와 같이

public static final , public abstract 로 시작되어야 하며 이는 생략가능하나 실제로는 작성되어있다.

 

interface Moveable
{
 	int AVG-SPEED = 40;
 	void move();
}

class Vehicle implements Moveable
{
 	public void move()
 	{
  		System .out. print in ("Average speed is"+AVG-SPEED);
 	}
 	public static void main (String[] arg)
 	{
  		Vehicle vc = new Vehicle();
  		vc.move();
 	}
}

interface의 사용이유는 : 공동작업을 편하게 하기위해서이다.

 

- Generic(제네릭)이란?

 

타입을 외부에서 정의해주는거

원시타입은불가 ( char, byte, short, int , long, float, double, boolean 등)

참조타입만 가능 (객체, 배열, 함수 ... )

 

class HELLO<h>{ //보통 묵시적으로 T,S 같은 문자를 쓴다고 한다.
    public h hi;
}
 
public class GenericDemo {
 
    public static void main(String[] args) {
        HELLO<String> h1 = new HELLO<String>(); 
        HELLO<StringBuilder> p2 = new HELLO<StringBuilder>();
    }
 
}

Object로 모든것을 받을수있지만 java에서는 타입이 안전하지 않다는것에 민감함.

그렇기 때문에 타입의 안전해지지 않는 상황을 예방하기 위해 Generic이라는 개념이 도입되었다.

결론은 타입의 안전성, 코드의 중복을 제거(편의성)을 위한것

 

 

제네릭 - Java

제네릭이란? 제네릭(Generic)은 클래스 내부에서 사용할 데이터 타입을 외부에서 지정하는 기법을 의미한다. 말이 어렵다. 아래 그림을 보자. 위의 그림은 아래의 코드를 간략화한 것이다. package org.opentutorials.javatutorials.generic; class Person { public T info; } public class GenericDemo { public static void main(String[] args) { P

opentutorials.org

 

- Arrays.sort()

 

java.util.Arrays.sort 에 있다.

Arrays.sort(arr) // arr은 배열

Arrays.sort(conf_time, new Comparator<int[]>() {	 // conf_time 은 2차원배열
     public int compare(int[] o1, int[] o2) { 		 // o1, o2는 앞의 배열,뒤의 배열
         if(o2[1]==o1[1]) {				// o1,o2의 1번째 배열이 동일하다면
              return o1[0]-o2[0];		// o1,o2의 0번째 배열을 오름차순으로
         }
              return  o1[1] - o2[1];	// 그리고 1번째 배열도 오름차순으로
         }
});

// <> 는 Generic으로 들어갈 타입을 정하는것으로
// int[]를 집어넣었다는것은 int[][] 에서 int[]를 기준으로 생각하겠다는뜻이다.

Arrays.sort(jewelry, (o1,o2) -> { // o1, o2는 앞의 배열, 뒤의 배열 
            if(o1[0] == o2[0])
                return Integer.compare(o1[1], o2[1]); // 첫째항이 같다면 두번째꺼 비교하고
            else
                return Integer.compare(o1[0],o2[0]); // 다르다면 그대로 리턴

        });

- charAt()

 

String N = "bulabula"

System.out.println(N.charAt(0)) //  -> b

System.out.println(N.charAt(1)) // -> u

.

..

System.out.println(N.charAt(7)) // -> a

 

- '==' 연산자 비교

 

.equals > 비교하고자하는 내용자체를 비교

==      > 비교하고자하는 대상의 주소를 비교

Comments