레이블이 문자열인 게시물을 표시합니다. 모든 게시물 표시
레이블이 문자열인 게시물을 표시합니다. 모든 게시물 표시

2015년 8월 7일 금요일

C# 6.0의 문자열 보간 (string interpolation)

 C# 6.0은 이전 버전의 메이져 업그레이드가 아니라 사용자 편의성을 높일 자잘한 기능들이 추가되었는데 문자열 보간도 그 중 하나이다. 예를 들어서 문자열의 중간에 변수의 값을 넣고 싶다면 String.Format()함수를 이용하였다.

str = String.Format(“da is {0}.\r\n”, da);

또는 Console.Writeln함수에서도 이런 형식을 입력할 수 있다.

Console.Writeln(“da is {0}.\r\n”, da);

C# 6.0에서는 이것보다 더 간단한 표현식을 제공한다.

str = $“da is {da}.\r\n”;
Console.Writeln($“da is {da}.\r\n”);

위와 같이 문자열 앞에 $를 붙이면 문자열 내부의 {...}안에 변수가 바로 올 수 있다. 이것을 문자열 보간(string interpolation)이라고 하고 컴파일 시에 내부적으로 String.Format() 함수를 이용한 코드로 적절하게 해석이 된다. 이 새로운 문법이 보기에 훨씬 더 간결하다.

 이 방법으로 정렬과 표시 방법도 옵션으로 지정할 수 있다. 예를 들어서 이전에는 다음과 같이 코딩했던 것을
 
for (int ctr = 0; ctr < names.Length; ctr++)
{
 Console.WriteLine("{0,-20} {1,5:N1}", names[ctr], hours[ctr]);
}
유사하게 문자열 앞에 ‘$’를 붙이고 {...} 안에서는 번호(인덱스) 대신 변수명으로 대신하여 사용할 수 있다.

for (int ctr = 0; ctr < names.Length; ctr++)
{
  Console.WriteLine($"{names[ctr],-20} {hours[ctr],5:N1}");
}
여기에서 첫 번째 변수는 20칸 좌정렬이 되고 두 번째 변수는 5칸 우정렬에  N1형식으로 표시된다.


2015년 7월 9일 목요일

자바(JAVA)에서 문자열을 숫자로 변환하기

 이전 포스트에서 설명한 포장형(wrapper class)의 생성자를 이용하면 문자열을 기본형 값으로 바꿀 수 있다.

[표 1] 포장형의 기본형 값을 반환하는 객체 메쏘드
메소드명
기능
byteValue()
byte값을 반환한다.
shortValue()
short값을 반환한다.
intValue()
int값을 반환한다.
longValue()
long값을 반환한다.
floatValue()
float값을 반환한다.
doubleValue()
double값을 반환한다.

예를 들어서 다음과 같이 Integer 형 객체에서 다양한 기본형 값을 얻을 수 있다.

package tut02;
public class Tut02 {
   public static void main(String[] args) {
       int ia = new Integer("1234567").intValue();
       float fa = new Integer("1234567").floatValue();
       short sa = new Integer("1234567").shortValue(); //(*)

       System.out.println(ia);
       System.out.println(fa);
       System.out.println(sa);
   }
}
실행 결과
1234567
1234567.0
-10617

위의 (*)에서와 같이 손실 변환(lossy conversion)의 경우에도 별다른 경고나 오류를 발생하지 않는다. 따라서 같은 형의 데이터의 변환에만 쓰는 것이 바람직하다.

 포장형으로 부터 기본형 값을 얻는 메소드로 parse 로 시작하는 정적 메소드들이 있다. 이 메소드를 이용하면 정수형을 반환하는 메소드는 기수를 지정해 줄 수도 있다.

[표 2] 포장형의 기본형 값을 반환하는 메쏘드
메소드명
기능
Byte.parseByte(String)
Byte.parseByte(String, radix)
문자열을 byte값으로 변환한다.
기수 radix인 문자열을 byte값으로 변환한다.
Short.parseShort(String)
Short.parseShort(String, radix)
문자열을 short값으로 변환한다.
기수 radix인 문자열을 short값으로 변환한다.
Integer.parseInt(String)
Integer.parseInt(String, radix)
문자열을 int값으로 변환한다.
기수 radix인 문자열을 int값으로 변환한다.
Long.parseLong(String)
Long.parseLong(String, radix)
문자열을 long값으로 변환한다.
기수 radix인 문자열을 long값으로 변환한다.
Float.parseFloat(String)
문자열을 float값으로 변환한다.
Double.parseDouble(String)
문자열을 double값으로 변환한다.

실제 프로그램에서는 주로 [표 2]의 정적 메소드를 자주 사용하게 된다.

package tut02;
public class Tut02 {
   public static void main(String[] args) {
       int ia = Integer.parseInt("1234567");
       int ib = Integer.parseInt("11110010",2); //이진수
       int ic = Integer.parseInt("1ab3f",16); //십육진수

       System.out.println(ia);
       System.out.println(ib);
       System.out.println(ic);
   }
}
실행 결과
1234567
242
109375

 포장형 객체를 반환하는 valueOf() 이라는 정적 메소드도 있다.

[표 3] 문자열로 부터 포장형 객체를 반환하는 메쏘드
메소드명
기능
Byte.valueOf(String)
Byte.valueOf(String,radix)
Byte.valueOf(byte)
문자열을 Byte 객체로 변환
기수 radix인 문자열을 Byte 객체로 변환한다.
byte값을 Byte 객체로 박싱
Short.valueOf(String)
Short.valueOf(String,radix)
Short.valueOf(short)
문자열을 Short 객체로 변환
기수 radix인 문자열을 Short 객체로 변환한다.
short값을 Short 객체로 박싱
Integer.valueOf(String)
Integer.valueOf(String,radix)
Integer.valueOf(int)
문자열을 Integer 객체로 변환
기수 radix인 문자열을 Interger 객체로 변환한다.
int값을 Interger 객체로 박싱
Long.valueOf(String)
Long.valueOf(String,radix)
Long.valueOf(long)
문자열을 Long 객체로 변환
기수 radix인 문자열을 Long 객체로 변환한다.
long값을 Long 객체로 박싱
Float.valueOf(String)
Float.valueOf(float)
문자열을 Float 객체로 변환한다.
float값을 FLoat 객체로 박싱
Double.valueOf(String)
Double.valueOf(float)
문자열을 Double 객체로 변환한다.
float값을 Double 객체로 박싱

예를 들어서

int ia = Integer.valueOf("1234567");

이렇게 하면 자동 언박싱이 일어나서 변수 ia에 1234567이란 값이 저장된다. 하지만 parseInt()함수보다는 당연히 성능이 떨어진다.

2015년 7월 7일 화요일

자바(JAVA) 문자열 객체와 System.out.println()함수

 자바에서는 문자열(string)을 처리할 수 있는 String 클래스를 제공한다. 클래스에 대해서는 아직 설명하지 않았지만 문자열은 간단하게라도 알고 넘어가야 한다. 자바에서 문자열은 기본형이 아니라 참조형이고 큰따옴표를 이용하여 표현한다. 그리고 문자열 변수를 선언/초기화하는 것은 String은 클래스이지만 기본형의 변수를 선언하고 초기화하는 방법과 동일하다.

String name; //문자열 선언
name = “홍길동”; // 문자열 초기화

String title = “선생님”;//선언과 동시에 초기화

다음과 같이 화면에 출력할 수도 있다.

System.out.println(name); // name 문자열의 내용이 화면에 출력된다.

두 개의 문자열을 서로 연결하는 데 ‘+’연산자를 이용할 수도 있다.

String fullName = name + title; // 두 문자열 연걸
String sayHi = “안녕하세요. “ + name;
String sayHello = “안녕하세요. “ + name + title; //세 개 이상도 연결 가능

다음과 같이 System.out.println() 함수에 문자열 연결식을 직접 입력할 수도 있다.

System.out.println(“안녕하세요. “+name+”씨.”);

이렇게 하면 불필요한 문자열 변수를 생성하지 않고 직접 연결된 문자열을 화면에 출력할 수 있다.

 어떤 기본형 변수의 값을 출력할 때에도 System.out.println()함수를 사용할 수 있다.

double da = 11.2;
System.out.println(da);

함수 System.out.println() 는 문자열을 인자로 주어야 하는데 이경우 변수값 da는 내부적으로 문자열로 자동으로 변환되어서 System.out.println()에 그 문자열을 넘겨준다. 따라서 다음과 같이 연결하는 것도 가능하다.

double da = 11.2;
System.out.println(“da 값은 “ + da + “입니다.”);

이 경우 연결이 일어나기 전에 da값은 문자열로 변환되어 세 개의 문자열을 연결한 새로운 문자열이 System.out.println()에 인자로 넘어가는 것이다.

2015년 6월 25일 목요일

MATLAB의 문자열(string)과 관련 함수

 MATLAB에서 행렬의 원소로 문자열을 사용하는 것이 가능하다. 문자열은 작은 따옴표나 큰따옴표로 묶는다.

>> A=['hi']
A = hi
>> B="there"
B = there

두 번째 예를 보면 문자열은 그 자체로 행벡터임을 알 수 있다.. 벡터의 각 요소는 하나의 문자인 것이다. 따라서 행렬의 인덱싱도 가능하다.

>> size(B)
ans =
  1   5

>> B(3)
ans = e

>> B(1)="T"
B = There

따라서 다음과 같이 두 행렬을 한 행렬로 표현함으로써 문자열의 합성도 가능하다.

>> C=[A B]
C = hiThere

문자열 행렬도 생성 가능한데 문자열 자체가 행벡터이므로 한 행에 하나의 문자열을 지정해 주면 된다.

>> D=['hi';'there']
D =
hi
there

>> size(D)
ans =
  2   5

위의 예에서 행렬 D는 첫 번째 행의 크기는 2(문자)이고 두번째 행의 크기는 5(문자)인데 행렬이 구성되었다. 이경우 빈 곳은 공백문자로 채워진다.

 문자열 관련 함수들은 다음과 같다.

[표 1] 문자열 관련 함수들
함수
기능
strcat(s1, s2, …)
strvcat(s1,s2,...)
문자열들을 하나의 행벡터로 합친다.
문자열들을 한 행렬로 합친다.(각 문자열을 별도의 행으로 지정)
char(x)
숫자(아스키코드) 행렬로 부터 문자열을 생성한다.
ischar(x)
x가 문자열이면 논리1(true)반
num2str(x)
숫자를 문자열로 바꾼다.
sprintf(FORMAT, A,B,...)
C 언어의 printf() 와 같은 기능을 수해하여 문자열 생성
lower(s)
upper(s)
문자열을 소문자로 변환
문자열을 대문자로 변환
strcmp(s1,s2)
s1과 s2가 같다면 논리1(true)반환, 그렇지 않다면 논리0(flase)반환
findstr(s1,s2)
둘 중 긴 문자열에서 짧은 문자열이 시작되는 인덱스 반환


2015년 6월 17일 수요일

싸이랩(scialb)의 문자열을 실행하는 함수

 Scilab명령어를 담은 문자열을 실행시킬 수 있는 명령어들이 있다. 세 개가 있는데 다음 표에 정리하였다.

[표 1] 문자열을 실행시키는 함수들
함수명
기능
execstr
Scilab 명령 문자열을 실행한다.
eval
evstr
Scilab expression 실행(행렬 반환)
위와 기능은 동일하나 에러를 traping할 수 있음
 먼저 execstr()은 Scilab 명령을 담은 문자열을 실행하는 것이다. (MATLAB의 eval 함수의 기능에 해당됨.)
>> execstr('a=1+sin(%pi/2)')
>> a
a  =
    2.  
이 예에서 보듯이 execstr()함수는 세미콜론이 붙지 않은 명령이라도 그 결과를 콘솔창에 표시하지 않는다. 만약 문자열에 명령 에러가 있다면 execstr()함수는 실행이 멈추게 된다. 다음 예를 보자.
>> execstr('a=2#4'), c=%i
 a=2#4
     !--error 276
Missing operator, comma, or semicolon.
in  execstr instruction    called by :  
execstr('a=2#4'), c=%i
이 예에서 ‘a=2#4’라는 명령은 문법 오류가 있으므로 거기서 실행이 멈춰버리고 에러메서지를 밷는다. 따라서 c=%i 라는 그 뒤의 명령은 실행되지 않는다.

만약 실행을 멈추지 않고 에러의 발생 여부를 처리하고 싶다면 다음 예와 같이 옵션을 사용하면 된다.

>> ier = execstr(['a#2','b=%pi'], 'errcatch','n'), c=%i
ier  =
   4.  
c  =
   i    
   
두 번째 인수로 ‘errcatch’ 를 주었는데 이것은 에러가 발생하면 실행을 멈추지 말고 단순히  ier에 그 결과를 반환하라는 것이다. 세 번째 인수가 ‘n’ 이라면 에러의 개수를 ‘m’ 이라면 에러메세지를 반환하다. 이 경우는 execstr()함수 뒤의 c=%i 가 실행된다는 점이 앞으 경우와 다르다. execstr()함수에는 두개의 명령 ‘a#2’ 와 ‘b=%pi’ 가 들어갔는데 두 번째 명령은 오류가 없음에도 첫 번째 명령에 에러가 있으면 두 번째 것이 실행되지 않고 에러를 캐치하고 넘어가 버린다. 따라서 변수 b도 생성되지 않고 c만 생성이 된 것이다.
 함수 eval()과 evstr()은 문자열 행렬의 값을 구해서 행렬로 반환해 주는 함수이다. 두 함수의 차이점은 에러를 캐치할 수 있느냐(evstr 함수), 없으냐(eval)이다. 예를 들면 다음과 같다.
>> a=%i; b=%e;
>> A=eval(['a' 'b'; 'a+b' 'a-b'])
A  =
   i                  2.7182818        
   2.7182818 + i    - 2.7182818 + i  

 evstr()함수는 두 번째 출력 인수를 지정해 주면 그것에 에러의 번호를 반환하고 함수 자체는 실행이 멈추지 않고 정상적으로 종료된다.

>> A=eval(['a' 'c'; 'a+b' 'a-b']); d=10;
!--error 4
Undefined variable: c
at line       3 of function %eval called by :  
at line      20 of function eval called by :  
A=eval(['a' 'c'; 'a+b' 'a-b']); d=10;
 
이 예에서 eval()함수 내부의 c변수는 없는 변수이므로 에러를 발행하고 실행이 거기서 멈춰버린다. 따라서 뒤에 있는 d=10; 이라는 명령은 실행되지 않는다. 반면에 다음 예를 보자.
>> [A,ier]=evstr(['a' 'c'; 'a+b' 'a-b']); d=10;
>>d
d  =
   10.

이 예에서 evstr()은 eval()과 같은 일을 수행하지만 만약 에러가 발행한다면 두 번째 출력인수 ier에 에러의 코드를 반환하고 정상적으로 종료한다. 따라서 그 뒤에 오는 명령인 d=10;도 정상적으로 수행된다.