Search

반응형

'Software'에 해당되는 글 190건

  1. 2020.04.17 [자바]클래스(class), 객체(object) 그리고 인스턴스(화) 기초정리...
  2. 2020.04.12 [java]System.currentTimeMillis() 와 System.nanoTime() 사용하기. 1
반응형

객체지향언어인 자바를 공부하시는 분들께

클래스, 객체, 인스턴스에 대해 확실히 정리하고 가는 시간이 되었으면 합니다.

최대한 쉽게 설명은 했지만 혹시 더 궁금하신 부분이 있다면 댓글 주세요.

객체지향 프로그래밍을 위한 클래스, 객체 그리고 인스턴스에 대해 예를 들어 설명해보겠습니다.

프로그램을 만들 때 목적이 있습니다. 이유없이 존재하는 프로그램은 없거든요.

은행 고객관리 프로그램을 만든다고 가정해 봅니다.

가장 큰 목적은 은행에서 관리하는 고객관리입니다.

그렇다면 중요한 포인트가 어떤 것이 있을까요?

 

먼저 기본 고객정보가 필요하겠지요?

다른 고객과 식별이 가능한 이름, 나이(주민번호), 전화번호, 주소 등이 필요합니다.

그리고 가입도 하고 정보도 수정하고 탈회도 할 수 있기에 그런 기능도 필요합니다.

또한 은행 고객이기에 이 고객이 가지고 있는 은행 상품이 있습니다.

가입한 상품명(oo적금, oo예금, oo대출 등), 계좌번호, 금액, 기간, 가입일, 해지일 등일 겁니다.

이 또한 가입하기, 해지하기 등의 기능이 필요합니다.

또한 고객의 신용정보도 필요합니다. 이 부분은 고객정보에 취합할 수도 있지만 보통 신용정보는 다른 기관에서 가져오기 때문에 별도의 정보로 관리할 수도 있습니다.

고객정보, 신용등급, 변경이력 등에 대한 정보가 있을 것이고 신용정보 조회 같은 기능도 필요합니다.

사실 실제 은행에서 사용하는 프로그램은 복잡하지만 객체지향의 개념에 대해 설명하기 위해 간단하게 표현해 보겠습니다.

클래스(class)는 공통적인 성질을 가진 부류나 종류라고 사전에 정의되어 있습니다.

자바에서 사용하는 클래스도 비슷한 개념으로 생각하면 됩니다.

우선 은행은 고객이 필요합니다. 고객은 은행에서 식별 및 활용할 수 있는 정보와 가입, 정보 변경 등을 할 수 있는 기능이 필요합니다.

그 정보와 기능을 정리(설계)해서 프로그램으로 틀을 만드는 것을 클래스라고 합니다.

클래스는 공통적인 성질을 가진 종류에 대해 정보(데이터)와 기능을 기술해 놓은 명세서입니다.

해당 은행의 모든 고객은 은행업무에 필요한 같은 종류의 정보와 기능을 가지고 있다는 의미입니다.

 

이 클래스를 바탕으로 실제 활동할 고객을 만들어야 합니다.

만들 고객들을 객체라고 합니다.

이 객체를 실제 new라는 키워드를 사용해서 메모리에 올리면 객체를 인스턴스화 했다고 합니다.

정리를 하면,

객체를 만들기 위해 필요한 정보와 기능을 정의해 놓은 것을 클래스라고 하고,

그 클래스를 가지고 만든 것이 객체이며,

객체가 new 키워드로 메모리에 적재되면 인스턴스가 됩니다.

 

김은행씨가 인터넷 뱅킹으로 접속하면 고객 클래스에서 객체를 하나 만들어 메모리에 인스턴스화 합니다.

동시에 홍대출씨가 인터넷 뱅킹으로 접속하면 고객 클래스에서 또 하나의 객체를 하나 만들어 메모리의 다른 위치에 인스턴스화 합니다.

 

BankCustomer bc = new BankCustomer();

고객 클래스[BankCustomer], 객체[bc], 인스턴스화[new BankCustomer()]

김은행, 홍대출 두 고객이 동시 접속을 하면 bc로 이름은 같은 객체이지만 JVM의 힙 메모리의 각각 다른 영역에 저장되어 독립적으로 관리된다.

지금까지 자바 객체지향의 기본이 되는 클래스, 객체, 인스턴스에 대해 알아봤습니다.

즐코딩하세요~

반응형
반응형

안녕하세요. 올드한 개발자 티보이입니다.

자바 코딩을 하다 보면 시간 관련 기능이 필요할 때가 있습니다.

자바로 개발된 프로그램이 간혹 느려지면 디버깅 시 경과시간을 체크해야 되는 경우가 있습니다.

비슷하면서도 다른 두 개의 메서드인 System.currentTimeMillis() System.nanoTime()에 대해 알아보겠습니다.

public static long currentTimeMillis();

첫번째 메서드인 System.currentTimeMillis() 에 대해 알아봅니다.

현재 시간과 UTC(협정세계시)인 197011일 자정과의 차이로 밀리세컨드(1/1000초) 값을 반환합니다.

다음 예를 통해 사용법을 확인해 봅니다.

1
2
3
4
5
6
7
8
9
10
11
long curLong = System.currentTimeMillis();        
System.out.println(curLong);
 
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss"); // HH 24시간  hh 12시간
String curTime = sdf.format(new Date(curLong));
 
System.out.println(curTime);
Thread.sleep(5000);
long endLong = System.currentTimeMillis();
 
System.out.println((endLong - curLong)/1000 + "초 걸림");  // 밀리초라 천분의 1로
cs

결과: 

1586618583204
2020-23-12 00:23:03
5초 걸림

두 번째 System.nanoTime()는 JDK1.5부터 추가된 메서드입니다.

public static long nanoTime();

그럼 앞에 설명한 System.currentTimeMillis()어떻게 다를까요?

이 메서드는 현재 시간(시스템 시간)과 관계가 없습니다.

작동중인 JVM의 정밀한 시간 소스의 현재 값을 long타입으로 나노세컨드(1/1000000000초)를 반환합니다.

그래서 현재 시간을 측정하기 위해서 사용하면 안 되겠지요.

그리고 분산 시스템에서 다른 JVM끼리 시간 측정을 위해 사용하면 안 됩니다.

JVM마다 측정하기 위한 기준값이 다르기에 절대값이 될 수 없습니다.

, 서버간 데이터 전송 시간을 측정하기 위해 사용하면 안 된다는 겁니다.

밀리세컨드(1/1000)를 사용하는 System.currentTimeMillis() 보다 더 정밀합니다.

다음 예를 통해 사용법을 확인해 봅니다.

1
2
3
4
5
6
7
long nTime = System.nanoTime();
System.out.println(nTime);
Thread.sleep(5000);
long eTime = System.nanoTime();
System.out.println(eTime);
 
System.out.println((eTime-nTime)/1000000000 + "초 걸림"); // 나노초라 10억분의 1로
cs
 

결과:

94882998233500
94887998455400
5초 걸림

결론은 시스템의 시간을 사용하기 위해서나 오늘 날짜를 알아내기 위해서는 System.currentTimeMillis()를 사용하면 되고

개발한 프로그램의 성능 측정을 위해 나노초로 정밀하게 구간 시간 측정을 위해서는 System.nanoTime() 사용하면 됩니다.

하지만 다른 서버 간 통신 시간 측정 시에는 System.nanoTime()를 사용하면 안 됩니다.

즐 코딩하세요.

반응형